待加密的字节数不能超过密钥的长度值除以 8 再减去 11(即:RSACryptoServiceProvider.KeySize / 8 - 11),而加密后得到密文的字节数,正好是密钥的长度值除以 8(即:RSACryptoServiceProvider.KeySize / 8)。
分段加密
为解决长字符加密的异常,我们采取分段加密的方法进行字符串加密,代码如下:
//加密 public static String SubRSAEncrypt(string xmlPublicKey, string enptStr) { RSACryptoServiceProvider provider = new RSACryptoServiceProvider(); provider.FromXmlString(xmlPublicKey); Byte[] bytes = Encoder.GetBytes(enptStr); int MaxBlockSize = provider.KeySize / 8 - 11; //加密块最大长度限制 if (bytes.Length <= MaxBlockSize) return Convert.ToBase64String(provider.Encrypt(bytes, false)); using (MemoryStream PlaiStream = new MemoryStream(bytes)) using (MemoryStream CrypStream = new MemoryStream()) { Byte[] Buffer = new Byte[MaxBlockSize]; int BlockSize = PlaiStream.Read(Buffer, 0, MaxBlockSize); while (BlockSize > 0) { Byte[] ToEncrypt = new Byte[BlockSize]; Array.Copy(Buffer, 0, ToEncrypt, 0, BlockSize); Byte[] Cryptograph = provider.Encrypt(ToEncrypt, false); CrypStream.Write(Cryptograph, 0, Cryptograph.Length); BlockSize = PlaiStream.Read(Buffer, 0, MaxBlockSize); } return Convert.ToBase64String(CrypStream.ToArray(), Base64FormattingOptions.None); } } //解密 public static String SubRSADecrypt(string xmlPublicKey, string enptStr) { RSACryptoServiceProvider provider = new RSACryptoServiceProvider(); provider.FromXmlString(xmlPublicKey); Byte[] bytes = Convert.FromBase64String(enptStr); int MaxBlockSize = provider.KeySize / 8; //解密块最大长度限制 if (bytes.Length <= MaxBlockSize) return Encoder.GetString(provider.Decrypt(bytes, false)); using (MemoryStream CrypStream = new MemoryStream(bytes)) using (MemoryStream PlaiStream = new MemoryStream()) { Byte[] Buffer = new Byte[MaxBlockSize]; int BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize); while (BlockSize > 0) { Byte[] ToDecrypt = new Byte[BlockSize]; Array.Copy(Buffer, 0, ToDecrypt, 0, BlockSize); Byte[] Plaintext = provider.Decrypt(ToDecrypt, false); PlaiStream.Write(Plaintext, 0, Plaintext.Length); BlockSize = CrypStream.Read(Buffer, 0, MaxBlockSize); } return Encoder.GetString(PlaiStream.ToArray()); } }
编写分段加密测试函数如下:
public static void SubRsaTest() { string myname = "my name is Kiba518!my name is Kiba518!my name is Kiba518!my name is Kiba518!my name is Kiba518!my name is Kiba518!my name is Kiba518!"; Console.WriteLine($"内容:{myname}"); string enStr = SubRSAEncrypt(publicKey, myname); Console.WriteLine($"加密字符串:{enStr}"); string deStr = SubRSADecrypt(privateKey, enStr); Console.WriteLine($"解密字符串:{deStr}"); }
运行结果,加密解密成功,如下图:
关于证书
文中创建的证书—Kiba518.pfx,就是https所使用的证书,换言之,https的证书就是个Rsa加密解密文件。
当然正式的可以在互联网中被各大网站认可的证书,是需要权威机构认证的,这个机构叫做CA,这个机构颁发的证书是.crt后缀名;而我们的pfx后缀名的证书,学名叫做个人信息交换证书。
其实它们没有什么区别,就是套的壳子不一样,crt证书的壳子里多一些属性,比如认证机构,有效期等等。但两个证书的核心内容是一样的,都是Rsa加密解密文件。
下面我们简单了解下证书的导入。
导入证书
在运行窗口(window+r)输入mmc打开microsoft管理控制台。
然后操作文件 -> 添加/删除管理单元,选择可用的管理单元中的证书点击添加。
添加完管理单元,在右侧控制台根节点会增加一个证书的根节点,如下图:
然后,我们展开节点,找到【个人—证书】节点,然后【右键—所有任务—导入】。
然后按向导提示导入证书。
需要注意的是浏览导入证书的对话框,默认导入的是crt类型,我们需要点击下拉菜单,选择人信息交换选项,如下图。
#f98f9d9b3e51290890ff268e2f55ba4c#
到此Rsa加密解密的基本使用已经介绍完了。
代码已经传到Github上了,欢迎大家下载。
Github地址:https://github.com/kiba518/RsaDemo
以上就是c# rsa加密解密详解的详细内容,更多关于c# rsa加密解密的资料请关注脚本之家其它相关文章!
您可能感兴趣的文章: