参考:基于RSA算法的ios客户端加密和C#服务端解密的解决方案
1.生成证书
打开vs开发人员工具使用如下命令生成证书:
makecert -ss My -n CN=Theoservice -sky exchange -pe
Makecert命令的详细说明请参看微软Makecert.exe工具的文档:https://msdn.microsoft.com/zh-cn/library/bfsktky3(v=vs.110).aspx
然后,开始->运行->MMC,打开MMC控制台。文件->添加/删除管理单元->添加按钮->选”证书”->添加->选”计算机账户”->关闭->确定,然后你就可以在 “个人->证书” 里看到刚才生成的证书了。
你可以导出一份不带私钥的cer格式的证书。这张证书只含有公钥,是用来和客户端一起发布出去用来加密数数据的。
2.获取:RSACryptoServiceProvider
1 X509Store store = new X509Store(StoreLocation.CurrentUser); 2 store.Open(OpenFlags.ReadOnly); 3 X509Certificate2Collection certCollection = store.Certificates; 4 X509Certificate2 cert = null; 5 6 // Loop through each certificate and find the certificate 7 // with the appropriate name. 8 foreach (X509Certificate2 c in certCollection) 9 { 10 if (c.Subject == "CN=Theoservice") 11 { 12 cert = c; 13 14 break; 15 } 16 } 17 store.Close(); 18 19 //从证书中获得含私钥的RSACryptoServiceProvider 20 21 RSACryptoServiceProvider provider = (RSACryptoServiceProvider)cert.PrivateKey; 22 byte[] buff=Encoding.UTF8.GetBytes(source); 23 /* 24 * 一次加密长度为 (KeySize/8)个byte。 25 * 而C#默认采用#PKSC1的padding模式,每次最多可以加密 (KeySize/8-11) 个byte。 26 * RSA分组加密算法每次从明文里取<=(KeySize/8-11)个byte,然后加密成(KeySize/8)个byte的密文; 27 * 解密的时候,每次就取(KeySize/8)个byte的密文,将其解密成<=(KeySize/8-11)个byte的明文。 28 * 因为#PKSC1的padding模式每次padding的内容是随机的,所以即使是加密同一段明文,每次的结果也不一样,这大大的增加了数据安全性。 29 */ 30 //加密 31 provider.Encrypt(buff, false); 32 //解密 33 provider.Decrypt(buff, false);
注:1. 每次加密最大(KeySize/8-11)个byte,解密(KeySize/8)个byte
2.加密后固定(KeySize/8)个byte
3.KeySize=密钥长度