当前位置:   article > 正文

使用RSA工具进行对信息加解密_rsa加解密在线工具

rsa加解密在线工具

我们在开发中需要对用户敏感数据进行加解密,比如密码

这边科普一下RSA算法

  1. RSA是非对称加密算法,与对称加密算法不同;在对称加密中,相同的密钥用于加密和解密数据,因此密钥的安全性至关重要;而在RSA非对称加密中,有两个密钥,一个是公钥,用于加密数据,另一个是私钥,用于解密数据;这意味着公钥可以公开分发,而私钥必须保持秘密;
  2. RSA非对称加密的主要应用包括:
  3. 数据加密:使用接收者的公钥加密数据,只有拥有相应私钥的接收者才能解密;
  4. 数字签名:使用发送者的私钥对数据签名,接收者可以使用发送者的公钥验证签名,确保数据的完整性和来源的真实性;
  5. 密钥协商:RSA也用于安全协议中,如TLS/SSL,用于安全地交换对称加密密钥,从而实现保密通信;
  6. 非对称加密算法提供了更高的安全性,因为加密和解密使用不同的密钥,攻击者无法从公钥推导出私钥;但由于非对称加密计算成本高昂,通常不用于大规模数据的加密,而是用于安全协商和数字签名等场景

今天就实现了一个RSA工具类,可以很轻松的对数据进行加解密

不需要加依赖,代码如下

  1. public class RSAUtils {
  2. /**
  3. * @param plaintext 要加密的字符串
  4. * @param publicKeyStr 传入的公钥,是一个字符串
  5. * @return 加密后的字符串, 以Base64编码的形式返回
  6. * @throws Exception 异常
  7. * 这个方法接受一个要加密的字符串和一个公钥字符串,使用公钥进行加密,然后返回加密后的字符串
  8. */
  9. public static String encrypt(String plaintext, String publicKeyStr) throws Exception {
  10. PublicKey publicKey = getPublicKeyFromString(publicKeyStr);
  11. Cipher cipher = Cipher.getInstance("RSA");
  12. cipher.init(Cipher.ENCRYPT_MODE, publicKey);
  13. byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes());
  14. return Base64.getEncoder().encodeToString(encryptedBytes);
  15. }
  16. /**
  17. * @param encryptedText 要解密的字符串
  18. * @param privateKeyStr 传入的私钥,是一个字符串
  19. * @return 解密后的原始字符串
  20. * @throws Exception 异常
  21. * 这个方法接受一个要解密的字符串和一个私钥字符串,使用私钥进行解密,然后返回解密后的原始字符串
  22. */
  23. public static String decrypt(String encryptedText, String privateKeyStr) throws Exception {
  24. PrivateKey privateKey = getPrivateKeyFromString(privateKeyStr);
  25. Cipher cipher = Cipher.getInstance("RSA");
  26. cipher.init(Cipher.DECRYPT_MODE, privateKey);
  27. byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
  28. byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
  29. return new String(decryptedBytes);
  30. }
  31. /**
  32. * @return
  33. * @throws Exception
  34. * 随机生成一个长度为2048的RSA公私钥对
  35. */
  36. public static KeyPair generateKeyPair() throws Exception {
  37. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
  38. keyPairGenerator.initialize(2048);
  39. return keyPairGenerator.generateKeyPair();
  40. }
  41. /**
  42. * @param publicKey
  43. * @return
  44. * 拿出刚生成Base64格式的私钥对的公钥字符串
  45. */
  46. public static String publicKeyToString(PublicKey publicKey) {
  47. return Base64.getEncoder().encodeToString(publicKey.getEncoded());
  48. }
  49. /**
  50. * @param privateKey
  51. * @return
  52. * 拿出刚生成Base64格式的私钥对的私钥字符串
  53. */
  54. public static String privateKeyToString(PrivateKey privateKey) {
  55. return Base64.getEncoder().encodeToString(privateKey.getEncoded());
  56. }
  57. /**
  58. * @param publicKeyStr
  59. * @return 公钥私钥对象
  60. * @throws Exception
  61. * 将刚拿出的Base64格式的私钥对的私钥字符串生成公钥对象
  62. */
  63. public static PublicKey getPublicKeyFromString(String publicKeyStr) throws Exception {
  64. byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
  65. X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKeyBytes);
  66. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  67. return keyFactory.generatePublic(spec);
  68. }
  69. /**
  70. * @param privateKeyStr
  71. * @return
  72. * @throws Exception
  73. * 将刚拿出的Base64格式的私钥对的私钥字符串生成私钥对象
  74. */
  75. public static PrivateKey getPrivateKeyFromString(String privateKeyStr) throws Exception {
  76. byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
  77. PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(privateKeyBytes);
  78. KeyFactory keyFactory = KeyFactory.getInstance("RSA");
  79. return keyFactory.generatePrivate(spec);
  80. }
  81. public static void main(String[] args) throws Exception {
  82. // 生成RSA密钥对
  83. KeyPair keyPair = generateKeyPair();
  84. PublicKey publicKey = keyPair.getPublic();
  85. PrivateKey privateKey = keyPair.getPrivate();
  86. // 将公钥和私钥转换为字符串
  87. String publicKeyStr = publicKeyToString(publicKey);
  88. String privateKeyStr = privateKeyToString(privateKey);
  89. System.out.println("公钥: " + publicKeyStr);
  90. System.out.println("私钥: " + privateKeyStr);
  91. // 加密和解密测试
  92. String plaintext = "大白猫真厉害";
  93. String encryptedText = encrypt(plaintext, publicKeyStr);
  94. System.out.println("加密后的子串: " + encryptedText);
  95. String decryptedText = decrypt(encryptedText, privateKeyStr);
  96. System.out.println("解密后的子串: " + decryptedText);
  97. }
  98. }

结果如下

1f17c69e518343f882a0d0ed2c8dd1fc.png

将数据用公钥加密,用私钥解密,这样就可以了

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/451266
推荐阅读