RSAUtil.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Org.BouncyCastle.Asn1.Pkcs;
  5. using Org.BouncyCastle.Asn1.X509;
  6. using Org.BouncyCastle.Crypto.Generators;
  7. using Org.BouncyCastle.Crypto.Parameters;
  8. using Org.BouncyCastle.Pkcs;
  9. using Org.BouncyCastle.Security;
  10. using Org.BouncyCastle.Crypto.Engines;
  11. using Org.BouncyCastle.X509;
  12. using Org.BouncyCastle.Crypto;
  13. using Org.BouncyCastle.Asn1;
  14. using Org.BouncyCastle.Crypto.Encodings;
  15. namespace RSAUtility
  16. {
  17. public class RSAUtil
  18. {
  19. private static Encoding Encoding_UTF8 = Encoding.UTF8;
  20. /// <summary>
  21. /// KEY 结构体
  22. /// </summary>
  23. public struct RSAKEY
  24. {
  25. /// <summary>
  26. /// 公钥
  27. /// </summary>
  28. public string PublicKey
  29. {
  30. get;
  31. set;
  32. }
  33. /// <summary>
  34. /// 私钥
  35. /// </summary>
  36. public string PrivateKey
  37. {
  38. get;
  39. set;
  40. }
  41. }
  42. public RSAKEY GetKey()
  43. {
  44. //RSA密钥对的构造器
  45. RsaKeyPairGenerator keyGenerator = new RsaKeyPairGenerator();
  46. //RSA密钥构造器的参数
  47. RsaKeyGenerationParameters param = new RsaKeyGenerationParameters(
  48. Org.BouncyCastle.Math.BigInteger.ValueOf(3),
  49. new Org.BouncyCastle.Security.SecureRandom(),
  50. 1024, //密钥长度
  51. 25);
  52. //用参数初始化密钥构造器
  53. keyGenerator.Init(param);
  54. //产生密钥对
  55. AsymmetricCipherKeyPair keyPair = keyGenerator.GenerateKeyPair();
  56. //获取公钥和密钥
  57. AsymmetricKeyParameter publicKey = keyPair.Public;
  58. AsymmetricKeyParameter privateKey = keyPair.Private;
  59. SubjectPublicKeyInfo subjectPublicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(publicKey);
  60. PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey);
  61. Asn1Object asn1ObjectPublic = subjectPublicKeyInfo.ToAsn1Object();
  62. byte[] publicInfoByte = asn1ObjectPublic.GetEncoded("UTF-8");
  63. Asn1Object asn1ObjectPrivate = privateKeyInfo.ToAsn1Object();
  64. byte[] privateInfoByte = asn1ObjectPrivate.GetEncoded("UTF-8");
  65. RSAKEY item = new RSAKEY()
  66. {
  67. PublicKey = Convert.ToBase64String(publicInfoByte),
  68. PrivateKey = Convert.ToBase64String(privateInfoByte)
  69. };
  70. return item;
  71. }
  72. private AsymmetricKeyParameter GetPublicKeyParameter(string keyBase64)
  73. {
  74. keyBase64 = keyBase64.Replace("\r", "").Replace("\n", "").Replace(" ", "");
  75. byte[] publicInfoByte = Convert.FromBase64String(keyBase64);
  76. Asn1Object pubKeyObj = Asn1Object.FromByteArray(publicInfoByte);//这里也可以从流中读取,从本地导入
  77. AsymmetricKeyParameter pubKey = PublicKeyFactory.CreateKey(publicInfoByte);
  78. return pubKey;
  79. }
  80. private AsymmetricKeyParameter GetPrivateKeyParameter(string keyBase64)
  81. {
  82. keyBase64 = keyBase64.Replace("\r", "").Replace("\n", "").Replace(" ", "");
  83. byte[] privateInfoByte = Convert.FromBase64String(keyBase64);
  84. // Asn1Object priKeyObj = Asn1Object.FromByteArray(privateInfoByte);//这里也可以从流中读取,从本地导入
  85. // PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKey);
  86. AsymmetricKeyParameter priKey = PrivateKeyFactory.CreateKey(privateInfoByte);
  87. return priKey;
  88. }
  89. /// <summary>
  90. /// 私钥加密
  91. /// </summary>
  92. /// <param name="data">加密内容</param>
  93. /// <param name="privateKey">私钥(Base64后的)</param>
  94. /// <returns>返回Base64内容</returns>
  95. public string EncryptByPrivateKey(string data, string privateKey)
  96. {
  97. //非对称加密算法,加解密用
  98. IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine());
  99. //加密
  100. try
  101. {
  102. RsaPrivateCrtKeyParameters key = (RsaPrivateCrtKeyParameters)GetPrivateKeyParameter(privateKey);
  103. engine.Init(true, key);
  104. byte[] byteData = Encoding_UTF8.GetBytes(data);
  105. int maxBlock = key.Modulus.BitLength / 8 - 11;
  106. List<byte> resultData = new List<byte>();
  107. //多次加密位置指示器
  108. int offSet = 0;
  109. for (int i = 0; byteData.Length > offSet; i++)
  110. {
  111. byte[] tmpByte = new byte[] { };
  112. if (byteData.Length - offSet > maxBlock)
  113. {
  114. tmpByte = engine.ProcessBlock(byteData, offSet, maxBlock);
  115. }
  116. else
  117. {
  118. tmpByte = engine.ProcessBlock(byteData, offSet, byteData.Length - offSet);
  119. }
  120. offSet = maxBlock * (i + 1);
  121. //中间结果加入结果数组
  122. resultData.AddRange(tmpByte);
  123. }
  124. string cipherText = Convert.ToBase64String(
  125. Encoding.UTF8.GetBytes(
  126. Convert.ToBase64String(resultData.ToArray())));
  127. return cipherText;
  128. }
  129. catch (Exception ex)
  130. {
  131. throw ex;
  132. }
  133. }
  134. /// <summary>
  135. /// 私钥解密
  136. /// </summary>
  137. /// <param name="data">待解密的内容</param>
  138. /// <param name="privateKey">私钥(Base64编码后的)</param>
  139. /// <returns>返回明文</returns>
  140. public string DecryptByPrivateKey(string data, string privateKey)
  141. {
  142. data = data.Replace("\r", "").Replace("\n", "").Replace(" ", "");
  143. //非对称加密算法,加解密用
  144. IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine());
  145. //解密
  146. try
  147. {
  148. RsaPrivateCrtKeyParameters key = (RsaPrivateCrtKeyParameters)GetPrivateKeyParameter(privateKey);
  149. engine.Init(false, key);
  150. int maxBlock = key.Modulus.BitLength/8;
  151. //用于解密的原始数据,经过两次Base64解码
  152. byte[] byteData =
  153. Convert.FromBase64String(
  154. Encoding.UTF8.GetString(
  155. Convert.FromBase64String(data)));
  156. List<byte> resultData = new List<byte>();
  157. //多次加密位置指示器
  158. int offSet = 0;
  159. for (int i = 0;byteData.Length>offSet ;i++)
  160. {
  161. byte[] tmpByte= new byte[] { };
  162. if (byteData.Length - offSet > maxBlock)
  163. {
  164. tmpByte= engine.ProcessBlock(byteData, offSet, maxBlock);
  165. }
  166. else
  167. {
  168. tmpByte=engine.ProcessBlock(byteData, offSet, byteData.Length - offSet);
  169. }
  170. offSet = maxBlock * (i+1);
  171. //中间结果加入结果数组
  172. resultData.AddRange(tmpByte);
  173. }
  174. return Encoding_UTF8.GetString(resultData.ToArray());
  175. }
  176. catch (Exception ex)
  177. {
  178. throw ex;
  179. }
  180. }
  181. /// <summary>
  182. /// 公钥加密
  183. /// </summary>
  184. /// <param name="data">加密内容</param>
  185. /// <param name="publicKey">公钥(Base64编码后的)</param>
  186. /// <returns>返回Base64内容</returns>
  187. public string EncryptByPublicKey(string data, string publicKey)
  188. {
  189. //非对称加密算法,加解密用
  190. IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine());
  191. //加密
  192. try
  193. {
  194. RsaKeyParameters key = (RsaKeyParameters)GetPublicKeyParameter(publicKey);
  195. engine.Init(true, key);
  196. byte[] byteData = Encoding_UTF8.GetBytes(data);
  197. int maxBlock = key.Modulus.BitLength / 8 - 11;
  198. List<byte> resultData = new List<byte>();
  199. //多次加密位置指示器
  200. int offSet = 0;
  201. for (int i = 0; byteData.Length > offSet; i++)
  202. {
  203. byte[] tmpByte = new byte[] { };
  204. if (byteData.Length - offSet > maxBlock)
  205. {
  206. tmpByte = engine.ProcessBlock(byteData, offSet, maxBlock);
  207. }
  208. else
  209. {
  210. tmpByte = engine.ProcessBlock(byteData, offSet, byteData.Length - offSet);
  211. }
  212. offSet = maxBlock * (i + 1);
  213. //中间结果加入结果数组
  214. resultData.AddRange(tmpByte);
  215. }
  216. string cipherText = Convert.ToBase64String(
  217. Encoding.UTF8.GetBytes(
  218. Convert.ToBase64String(resultData.ToArray())));
  219. return cipherText;
  220. }
  221. catch (Exception ex)
  222. {
  223. throw ex;
  224. }
  225. }
  226. /// <summary>
  227. /// 公钥解密
  228. /// </summary>
  229. /// <param name="data">待解密的内容</param>
  230. /// <param name="publicKey">公钥(Base64编码后的)</param>
  231. /// <returns>返回明文</returns>
  232. public string DecryptByPublicKey(string data, string publicKey)
  233. {
  234. data = data.Replace("\r", "").Replace("\n", "").Replace(" ", "");
  235. //非对称加密算法,加解密用
  236. IAsymmetricBlockCipher engine = new Pkcs1Encoding(new RsaEngine());
  237. //解密
  238. try
  239. {
  240. RsaKeyParameters key = (RsaKeyParameters)GetPublicKeyParameter(publicKey);
  241. engine.Init(false, key);
  242. //用于解密的原始数据,经过两次Base64解码
  243. byte[] byteData =
  244. Convert.FromBase64String(
  245. Encoding.UTF8.GetString(
  246. Convert.FromBase64String(data)));
  247. int maxBlock = key.Modulus.BitLength / 8;
  248. List<byte> resultData = new List<byte>();
  249. //多次加密位置指示器
  250. int offSet = 0;
  251. for (int i = 0; byteData.Length > offSet; i++)
  252. {
  253. byte[] tmpByte = new byte[] { };
  254. if (byteData.Length - offSet > maxBlock)
  255. {
  256. tmpByte = engine.ProcessBlock(byteData, offSet, maxBlock);
  257. }
  258. else
  259. {
  260. tmpByte = engine.ProcessBlock(byteData, offSet, byteData.Length - offSet);
  261. }
  262. offSet = maxBlock * (i + 1);
  263. //中间结果加入结果数组
  264. resultData.AddRange(tmpByte);
  265. }
  266. return Encoding_UTF8.GetString(resultData.ToArray());
  267. }
  268. catch (Exception ex)
  269. {
  270. throw ex;
  271. }
  272. }
  273. }
  274. }