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. }
~~~