热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#学习教程:使用RSACryptoServiceProvider进行公钥加密分享

使用RSACryptoServiceProvider进行公钥加密我已经在CodeProject上发表了一篇文章,解释了如何使用RSA提供程序进行加密和解密:RSA私钥加密虽然200

使用RSACryptoServiceProvider进行公钥加密

我已经在CodeProject上发表了一篇文章,解释了如何使用RSA提供程序进行加密和解密:

RSA私钥加密

虽然2009年的旧版本是错误的,但新的2012版本(具有System.Numerics.BigInteger支持)似乎更可靠。 这个版本缺少的是一种使用公钥加密并使用私钥 解密的方法。

所以,我自己尝试了,但是当我解密时会得到垃圾。 我不熟悉RSA提供商,所以我在这里很黑暗。 很难找到关于它应该如何工作的更多信息。

有谁看到这有什么问题? 以下是带有PUBLIC密钥的ENcryption:

// Add 4 byte padding to the data, and convert to BigInteger struct BigInteger numData = GetBig( AddPadding( data ) ); RSAParameters rsaParams = rsa.ExportParameters( false ); //BigInteger D = GetBig( rsaParams.D ); //only for private key BigInteger ExpOnent= GetBig( rsaParams.Exponent ); BigInteger Modulus = GetBig( rsaParams.Modulus ); BigInteger encData = BigInteger.ModPow( numData, Exponent, Modulus ); return encData.ToByteArray(); 

当我这样做时,我是否使用提供商提供的大“D”? 可能不是因为它是没有“D”的公钥。

然后是对应的(使用PRIVATE键进行DEcrypting):

 BigInteger numEncData = new BigInteger( cipherData ); RSAParameters rsaParams = rsa.ExportParameters( true ); BigInteger D = GetBig( rsaParams.D ); //BigInteger ExpOnent= GetBig( rsaParams.Exponent ); BigInteger Modulus = GetBig( rsaParams.Modulus ); BigInteger decData = BigInteger.ModPow( numEncData, D, Modulus ); byte[] data = decData.ToByteArray(); byte[] result = new byte[ data.Length - 1 ]; Array.Copy( data, result, result.Length ); result = RemovePadding( result ); Array.Reverse( result ); return result; 

我需要“D”或指数吗?

显然,我需要加密来兼顾私人 – 公共 – 私人。 任何帮助深表感谢!

这是一个例子:

  public static void rsaPlayground() { byte[] data = new byte[] { 1, 2, 3, 4, 5 }; RSACryptoServiceProvider csp = new RSACryptoServiceProvider();//make a new csp with a new keypair var pub_key = csp.ExportParameters(false); // export public key var priv_key = csp.ExportParameters(true); // export private key var encData = csp.Encrypt(data, false); // encrypt with PKCS#1_V1.5 Padding var decBytes = MyRSAImpl.plainDecryptPriv(encData, priv_key); //decrypt with own BigInteger based implementation var decData = decBytes.SkipWhile(x => x != 0).Skip(1).ToArray();//strip PKCS#1_V1.5 padding } public class MyRSAImpl { private static byte[] rsaOperation(byte[] data, BigInteger exp, BigInteger mod) { BigInteger bData = new BigInteger( data //our data block .Reverse() //BigInteger has another byte order .Concat(new byte[] { 0 }) // append 0 so we are allways handling positive numbers .ToArray() // constructor wants an array ); return BigInteger.ModPow(bData, exp, mod) // the RSA operation itself .ToByteArray() //make bytes from BigInteger .Reverse() // back to "normal" byte order .ToArray(); // return as byte array /* * * A few words on Padding: * * you will want to strip padding after decryption or apply before encryption * */ } public static byte[] plainEncryptPriv(byte[] data, RSAParameters key) { MyRSAParams myKey = MyRSAParams.fromRSAParameters(key); return rsaOperation(data, myKey.privExponent, myKey.Modulus); } public static byte[] plainEncryptPub(byte[] data, RSAParameters key) { MyRSAParams myKey = MyRSAParams.fromRSAParameters(key); return rsaOperation(data, myKey.pubExponent, myKey.Modulus); } public static byte[] plainDecryptPriv(byte[] data, RSAParameters key) { MyRSAParams myKey = MyRSAParams.fromRSAParameters(key); return rsaOperation(data, myKey.privExponent, myKey.Modulus); } public static byte[] plainDecryptPub(byte[] data, RSAParameters key) { MyRSAParams myKey = MyRSAParams.fromRSAParameters(key); return rsaOperation(data, myKey.pubExponent, myKey.Modulus); } } public class MyRSAParams { public static MyRSAParams fromRSAParameters(RSAParameters key) { var ret = new MyRSAParams(); ret.Modulus = new BigInteger(key.Modulus.Reverse().Concat(new byte[] { 0 }).ToArray()); ret.privExpOnent= new BigInteger(key.D.Reverse().Concat(new byte[] { 0 }).ToArray()); ret.pubExpOnent= new BigInteger(key.Exponent.Reverse().Concat(new byte[] { 0 }).ToArray()); return ret; } public BigInteger Modulus; public BigInteger privExponent; public BigInteger pubExponent; } 

以此编码/解码示例为例

上述就是C#学习教程:使用RSACryptoServiceProvider进行公钥加密分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—编程笔记

  byte[] toEncryptData = Encoding.ASCII.GetBytes("hello world"); //Generate keys RSACryptoServiceProvider rsaGenKeys = new RSACryptoServiceProvider(); string privateXml = rsaGenKeys.ToXmlString(true); string publicXml = rsaGenKeys.ToXmlString(false); //Encode with public key RSACryptoServiceProvider rsaPublic = new RSACryptoServiceProvider(); rsaPublic.FromXmlString(publicXml); byte[] encryptedRSA = rsaPublic.Encrypt(toEncryptData, false); string EncryptedResult = Encoding.Default.GetString(encryptedRSA); //Decode with private key var rsaPrivate = new RSACryptoServiceProvider(); rsaPrivate.FromXmlString(privateXml); byte[] decryptedRSA = rsaPrivate.Decrypt(encryptedRSA, false); string originalResult = Encoding.Default.GetString(decryptedRSA); 


推荐阅读
  • 【Modbus 】Modbus 协议
    Modbus协议简介Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。标准的Modbus协议物理层接口有RS232、RS422 ... [详细]
  • C#按值复制数组我有一个类型化的数组MyType[]types;我想制作这个数组的独立副本。我试过这个MyType[]types2newMyType[types.Length];t ... [详细]
  • neon serverless postgres 简单试用
    内容来自官方的docker-compose内容,主要是测试试用参考架构  从以上图可以看出,neon应该包含了几个组件,safekeeper,pageserver,计算节点,以及对 ... [详细]
  • CTF编程入门第一题 循环
    循环分值:10循环分值:10来源:北邮天枢战队难度:易参与人数:1478人GetFlag:467人答题人数:523人解题通过率:89%来源:北邮天枢战队难度:易参与人数:1478人 ... [详细]
  • 2022年Python面试题一.Python基础二.企业面试题结束语🥇🥇🥇✅作者简介:大家好我是编程IDὌ ... [详细]
  • c语言自定义BOOL函数C语言没有BOOL类型变量boolean类型是C++所独有的由于使用BOOL类型可以使代码更具有可读性,很多编程者都在C中自己定义了类似的应用,一般方法有两 ... [详细]
  • php如何实现n的阶乘
    这篇文章主要介绍php如何实现n的阶乘,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php实现n的阶乘的方法:1、通过普 ... [详细]
  • MFC中的文件读写操作
    由于要写个游戏工具方便编程,要用到文件类的操作,看到这篇文章不错,特转载计算机室如何管理自身所存放着的大量的信息的呢?win ... [详细]
  • 如果你有一个java.io.InputStream对象,你应该如何处理该对象并产生一个String?假设我有一个 ... [详细]
  • UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
    一、IPv4与IPv6的互操作性1.IPv4客户与IPv6服务器拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射 ... [详细]
  • 这篇文章将为大家详细讲解有关C#开发技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C#开发技 ... [详细]
  • 1,启动MySQL终端输入mysql-uroot-p然后输入密码,启动成功WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMyS ... [详细]
  • 第38天:Python decimal 模块
    by程序员野客在我们开发工作中浮点类型的使用还是比较普遍的,对于一些涉及资金金额的计算更是不能有丝毫误差,Python的decimal模块为浮点型精确计算提供了支持。1简介deci ... [详细]
  • 根据时间更改网站背景的脚本。热!
    我在网上找到了它,并以自己的方式对其进行了自定义;作者的功劳就在那里。实际上,这是一个用于更改背景颜色的脚本,并且在我看来& ... [详细]
  • 一、如果使用默认的1521端口,让实例自动注册到该监听上,那么local_listener无需设置,listener.ora文件按照正常方 ... [详细]
author-avatar
闻汝婕环境_259
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有