1. 非對稱加密簡介
與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公鑰(publickey)和私鑰(privatekey)。公鑰
與私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密;如果用私鑰對數據進行加密,
那么只有用對應的公鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加
密算法。
簡單理解為:加密和解密是不同的鑰匙。
常見算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)等

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

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