🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
1. 非对称加密简介 与对称加密算法不同,非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。公钥 与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密, 那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加 密算法。 简单理解为:加密和解密是不同的钥匙。 常见算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等 ![](https://box.kancloud.cn/b3d0d52f235fa10a48d4420e25677a11_485x268.jpg) 2. RSA算法简介 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年首次公布,当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。 今天只有短的RSA钥匙才可能被强力方式解破。到2017年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。 RSA算法基于一个十分简单的数论事实:将两个大质数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。 http://blog.csdn.net/sunmenggmail/article/details/11994013 ![](https://box.kancloud.cn/95261b6d1cbca94a341511a303706773_280x280.jpg) 3. RSA加密算法的缺点 虽然RSA加密算法作为目前最优秀的公钥方案之一,在发表四十年的时间里,经历了各种攻击的考验,逐渐为人们接受。但是,也不是说RSA没有任何缺点。由于没有从理论上证明破译RSA的难度与大数分解难度的等价性。所以,RSA的重大缺陷是无法从理论上把握它的保密性能如何。在实践上,RSA也有一些缺点: 1. 产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密; 2. 分组长度太大,为保证安全性,其内部运算代价很高,导致速度较慢。 4. RSA算法实现 ~~~ 1. package com; 2. 3. import java.io.UnsupportedEncodingException; 4. import java.security.InvalidKeyException; 5. import java.security.KeyPair; 6. import java.security.KeyPairGenerator; 7. import java.security.NoSuchAlgorithmException; 8. import java.security.PrivateKey; 9. import java.security.PublicKey; 10. 11. import javax.crypto.BadPaddingException; 12. import javax.crypto.Cipher; 13. import javax.crypto.IllegalBlockSizeException; 14. import javax.crypto.NoSuchPaddingException; 15. 16. public class RSATest { 17. 18. 19. public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, 20. InvalidKeyException, IllegalBlockSizeException, BadPaddingException, 21. UnsupportedEncodingException { 22. //要加密的字符串 23. String str = "你好黑马"; 24. //使用密钥生成工具,生成密钥 25. KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); 26. //生成一对密钥 27. KeyPair keyPair = keyPairGenerator.generateKeyPair(); 28. //获取私钥 29. PrivateKey privateKey = keyPair.getPrivate(); 30. //获取公钥 31. PublicKey publicKey = keyPair.getPublic(); 32. 33. String encrypted = encrypte(str,privateKey); 34. System.out.println("加密后:"+encrypted); 35. String decrypted = decrypte(encrypted,publicKey); 36. System.out.println("解密后:"+decrypted); 37. } 38. 39. private static String decrypte(String encrypted, PublicKey privateKey) throws 40. NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, 41. IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { 42. Cipher cipher = Cipher.getInstance("RSA"); //设置为解密模式 44. cipher.init(Cipher.DECRYPT_MODE, privateKey); 45. byte[] doFinal = cipher.doFinal(Base64.decode(encrypted)); 46. return new String(doFinal); 47. } 48. 49. private static String encrypte(String str, PrivateKey privateKey) throws 50. NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, 51. IllegalBlockSizeException, BadPaddingException { 52. //获取RSA加密算法 53. Cipher cipher = Cipher.getInstance("RSA"); 54. //初始化加密器 55. cipher.init(Cipher.ENCRYPT_MODE, privateKey); 56. //加密 57. byte[] doFinal = cipher.doFinal(str.getBytes()); 58. //对加密后的字节码进行Base64编码 59. return Base64.encode(doFinal); 60. } 61. } ~~~