Rsa 工具类,公钥私钥生成,加解密

待我称王封你为后i 2022-12-29 00:13 367阅读 0赞

包含分段加密和分段解密工具类:

  1. /**
  2. * Rsa 工具类,公钥私钥生成,加解密
  3. *
  4. * @author : YZD
  5. * @date : 2020-12-9 22:59
  6. */
  7. public class MyRsaUtils {
  8. /**
  9. * 测试加密内容
  10. */
  11. public static final String SRC = "测试加密内容";
  12. /**
  13. * 公钥
  14. */
  15. public static final String PUBLICKEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCCuF6cl/Il6Npp7KxcaQyfepfnOs14Rs4klLrKKu0CJhsTv+VuYFOH37YV9eoKzG10xX99Zn/TIRIndDUNlOB6HbbMH046r4Ip7/XEr0XWfO+jAk8fQ9BTnLFBy3DtOqndpluqmzXuXVLpxd5lhu9zJgzGY2Ts016iY6p6Gda2OQIDAQAB";
  16. /**
  17. * 私钥
  18. */
  19. public static final String PRIVATEKEY = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIK4XpyX8iXo2mnsrFxpDJ96l+c6zXhGziSUusoq7QImGxO/5W5gU4ffthX16grMbXTFf31mf9MhEid0NQ2U4HodtswfTjqvginv9cSvRdZ876MCTx9D0FOcsUHLcO06qd2mW6qbNe5dUunF3mWG73MmDMZjZOzTXqJjqnoZ1rY5AgMBAAECgYAkFJGAtWvPzOKkRAAbDZ+/UQ4mc5OM9DYn4Klh7dE3O59Tpy7DdXD42uWeUB8GVgCML4sN6MG1W7ZwD2IpWoNOq4w8xah6y7B2YhyPXEqSJsIpWiZNlEWiwZbGoqBFN1261Pyy5dhfaspFKbH+qbEanx+ezv7UvzFwg5uUzS2lgQJBANENPTJa4QoMpj/GBBtl2tD7yFLtbMvykgk/7pF6FyF3RDNr+QQD/Ay/H74IVRCow0oWn1b05BXzGiiaWQZGhjECQQCgE7W0SAuCZngz374wIYBxg3SdW0aetgtnsMfV0wFL1czh2qakqgnuu6u+y1FTgeGhJDDVTjpiutTSbyCgf8aJAkBbbHPH8tCZ6YBHQZ0IMloorQQlqCm9Y58UJn555q/49cTAzEaByBBRrr/+BnzVJUkKvKwAhma9ZqyY9y9ZvDvxAkBhdb6SRa7kNLkIdDfaG/uUoQF18KWdaZ6mAeaZE7/dSQ1VkQcWiARGGnLlVeps2k3iCyPEKr23cKK0gD4wGbtpAkBtzQ7qjrfOm0zLRUJOt7D0EcDIR9IaRtk3n4XSoJ94rJDHv/Toe7pwMfWsPFdnLesx5iZ6J5I8U196qjvY13t5";
  20. /**
  21. * 算法
  22. */
  23. public static final String ALGORITHM = "RSA";
  24. /**
  25. * 一次解密的长度
  26. */
  27. private static final int MAX_DECRYPT_BLOCK = 128;
  28. /**
  29. * 一次加密的长度
  30. */
  31. private static final int MAX_ENCRYPT_BLOCK = 117;
  32. public static void main(String[] args) throws Exception {
  33. System.out.println("\n");
  34. // 分段加密 解密
  35. String byPublicKeySplit1 = encryptByPrivateKeySplit(MyRsaUtils.PRIVATEKEY, " ");
  36. String byPublicKeySplit2 = decryptByPublicKeySplit(MyRsaUtils.PUBLICKEY, byPublicKeySplit1);
  37. System.out.println("\n");
  38. RsaKeyPair keyPair = generateKeyPair();
  39. System.out.println("公钥:" + keyPair.getPublicKey());
  40. System.out.println("私钥:" + keyPair.getPrivateKey());
  41. System.out.println("\n");
  42. test1(keyPair);
  43. System.out.println("\n");
  44. test2(keyPair);
  45. System.out.println("\n");
  46. }
  47. /**
  48. * 公钥加密 私钥解密
  49. */
  50. private static void test1(RsaKeyPair keyPair) throws Exception {
  51. System.out.println("***************** 公钥加密私钥解密开始 *****************");
  52. String text1 = encryptByPublicKey(keyPair.getPublicKey(), MyRsaUtils.SRC);
  53. String text2 = decryptByPrivateKey(keyPair.getPrivateKey(), text1);
  54. System.out.println("加密前:" + MyRsaUtils.SRC);
  55. System.out.println("加密后:" + text1);
  56. System.out.println("解密后:" + text2);
  57. if (MyRsaUtils.SRC.equals(text2)) {
  58. System.out.println("解密字符串和原始字符串一致,解密成功");
  59. } else {
  60. System.out.println("解密字符串和原始字符串不一致,解密失败");
  61. }
  62. System.out.println("***************** 公钥加密私钥解密结束 *****************");
  63. }
  64. /**
  65. * 私钥加密 公钥解密
  66. *
  67. * @throws Exception /
  68. */
  69. private static void test2(RsaKeyPair keyPair) throws Exception {
  70. System.out.println("***************** 私钥加密公钥解密开始 *****************");
  71. String text1 = encryptByPrivateKey(keyPair.getPrivateKey(), MyRsaUtils.SRC);
  72. String text2 = decryptByPublicKey(keyPair.getPublicKey(), text1);
  73. System.out.println("加密前:" + MyRsaUtils.SRC);
  74. System.out.println("加密后:" + text1);
  75. System.out.println("解密后:" + text2);
  76. if (MyRsaUtils.SRC.equals(text2)) {
  77. System.out.println("解密字符串和原始字符串一致,解密成功");
  78. } else {
  79. System.out.println("解密字符串和原始字符串不一致,解密失败");
  80. }
  81. System.out.println("***************** 私钥加密公钥解密结束 *****************");
  82. }
  83. /**
  84. * 公钥解密
  85. *
  86. * @param publicKeyText 公钥
  87. * @param text 待解密的信息
  88. * @return /
  89. * @throws Exception /
  90. */
  91. public static String decryptByPublicKey(String publicKeyText, String text) throws Exception {
  92. X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
  93. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  94. PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  95. Cipher cipher = Cipher.getInstance("RSA");
  96. cipher.init(Cipher.DECRYPT_MODE, publicKey);
  97. byte[] result = cipher.doFinal(Base64.decodeBase64(text));
  98. return new String(result);
  99. }
  100. /**
  101. * 分段 公钥解密
  102. *
  103. * @param publicKeyText 公钥
  104. * @param data 待解密的信息
  105. * @return /
  106. * @throws Exception /
  107. */
  108. public static String decryptByPublicKeySplit(String publicKeyText, String data) throws Exception {
  109. X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
  110. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  111. PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
  112. Cipher cipher = Cipher.getInstance("RSA");
  113. cipher.init(Cipher.DECRYPT_MODE, publicKey);
  114. byte[] decodeBase64 = Base64.decodeBase64(data);
  115. //得到报文密文的长度
  116. int inputLen = decodeBase64.length;
  117. ByteArrayOutputStream out = new ByteArrayOutputStream();
  118. int offSet = 0;
  119. byte[] cache;
  120. int i = 0;
  121. // 对数据分段解密
  122. while (inputLen - offSet > 0) {
  123. if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
  124. cache = cipher.doFinal(decodeBase64, offSet, MAX_DECRYPT_BLOCK);
  125. } else {
  126. cache = cipher.doFinal(decodeBase64, offSet, inputLen - offSet);
  127. }
  128. out.write(cache, 0, cache.length);
  129. i++;
  130. offSet = i * MAX_DECRYPT_BLOCK;
  131. }
  132. //解密后的数据
  133. byte[] byteArray = out.toByteArray();
  134. out.close();
  135. return new String(byteArray);
  136. }
  137. /**
  138. * 私钥加密
  139. *
  140. * @param privateKeyText 私钥
  141. * @param text 待加密的信息
  142. * @return /
  143. * @throws Exception /
  144. */
  145. public static String encryptByPrivateKey(String privateKeyText, String text) throws Exception {
  146. PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText));
  147. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  148. PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  149. Cipher cipher = Cipher.getInstance("RSA");
  150. cipher.init(Cipher.ENCRYPT_MODE, privateKey);
  151. byte[] result = cipher.doFinal(text.getBytes());
  152. return Base64.encodeBase64String(result);
  153. }
  154. /**
  155. * 分段 私钥 加密
  156. *
  157. * @param privateKeyText 私钥
  158. * @param data 待加密的信息
  159. * @return /
  160. * @throws Exception /
  161. */
  162. public static String encryptByPrivateKeySplit(String privateKeyText, String data) throws Exception {
  163. // 加密时超过117字节就报错。为此采用分段加密的办法来加密
  164. PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText));
  165. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  166. PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
  167. Cipher cipher = Cipher.getInstance("RSA");
  168. cipher.init(Cipher.ENCRYPT_MODE, privateKey);
  169. byte[] encryptedData = data.getBytes();
  170. int inputLen = encryptedData.length;
  171. ByteArrayOutputStream out = new ByteArrayOutputStream();
  172. int offSet = 0;
  173. byte[] cache;
  174. int i = 0;
  175. // 对数据分段加密 doFinal
  176. while (inputLen - offSet > 0) {
  177. if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
  178. cache = cipher.doFinal(encryptedData, offSet, MAX_ENCRYPT_BLOCK);
  179. } else {
  180. cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
  181. }
  182. out.write(cache, 0, cache.length);
  183. i++;
  184. offSet = i * MAX_ENCRYPT_BLOCK;
  185. }
  186. byte[] byteArray = out.toByteArray();
  187. out.close();
  188. return Base64.encodeBase64String(byteArray);
  189. }
  190. /**
  191. * 私钥解密
  192. *
  193. * @param privateKeyText 私钥
  194. * @param text 待解密的文本
  195. * @return /
  196. * @throws Exception /
  197. */
  198. public static String decryptByPrivateKey(String privateKeyText, String text) throws Exception {
  199. PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyText));
  200. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  201. PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
  202. Cipher cipher = Cipher.getInstance("RSA");
  203. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  204. byte[] result = cipher.doFinal(Base64.decodeBase64(text));
  205. return new String(result);
  206. }
  207. /**
  208. * 公钥加密
  209. *
  210. * @param publicKeyText 公钥
  211. * @param text 待加密的文本
  212. * @return /
  213. */
  214. public static String encryptByPublicKey(String publicKeyText, String text) throws Exception {
  215. X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyText));
  216. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  217. PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
  218. Cipher cipher = Cipher.getInstance("RSA");
  219. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  220. byte[] result = cipher.doFinal(text.getBytes());
  221. return Base64.encodeBase64String(result);
  222. }
  223. /**
  224. * 构建RSA密钥对
  225. *
  226. * @return /
  227. * @throws NoSuchAlgorithmException /
  228. */
  229. public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException {
  230. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  231. keyPairGenerator.initialize(1024);
  232. KeyPair keyPair = keyPairGenerator.generateKeyPair();
  233. RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
  234. RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
  235. String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded());
  236. String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
  237. return new RsaKeyPair(publicKeyString, privateKeyString);
  238. }
  239. /**
  240. * RSA密钥对对象
  241. */
  242. public static class RsaKeyPair {
  243. private final String publicKey;
  244. private final String privateKey;
  245. public RsaKeyPair(String publicKey, String privateKey) {
  246. this.publicKey = publicKey;
  247. this.privateKey = privateKey;
  248. }
  249. public String getPublicKey() {
  250. return publicKey;
  251. }
  252. public String getPrivateKey() {
  253. return privateKey;
  254. }
  255. }
  256. }

发表评论

表情:
评论列表 (有 0 条评论,367人围观)

还没有评论,来说两句吧...

相关阅读

    相关 java RSA加密解密

    RSA非对称加密原理此处不是重点,麻烦读者自行了解哦。如果了解了RSA,你就知道为什么要用公钥加密,私钥解密(不懂私聊哦),下面是RSA加解密例子,RSA加解密算法有好多种,这