RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个相同的算法,但他的发现被列入机密,一直到1997年才被发表。
对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA钥匙才可能被强力方式解破。到2013年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
RSA加密算法是世界第一个非对称加密算法,具体算法步骤如下:
1)随意选择两个大的质数p和q,p不等于q,计算N=pq(通常p和q都有155十进制位或都有512十进制位)
2)根据欧拉函数,求得r = φ(N) = φ(p)φ(q) = (p-1)(q-1)
3)选择一个小于r的整数e,求得e关于r的模反元素,命名为d。(模反元素存在,当且仅当e与r互质)
4)将p和q的记录销毁。
(N,e)是公钥,(N,d)是私钥
Java 实现 RSA 加密算法,具体代码如下:
package com; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.SecureRandom; import javax.crypto.Cipher; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * @author www.yoodb.com */ public class RSAEncrypt { /** 加密算法 DESEDE */ private static String ALGORITHM = "RSA"; /** key值大小 */ private static int KEYSIZE = 1024; /** 公钥存放文件自定义 */ private static String PUBLIC_KEY_FILE = "PublicKey"; /** 私钥存放文件自定义 */ private static String PRIVATE_KEY_FILE = "PrivateKey"; /** object 对象流 */ private static ObjectInputStream ois = null; /** * 生成密钥对 */ private static void generateKeyPair() throws Exception { SecureRandom sr = new SecureRandom(); //RSA算法可信任的随机数源 KeyPairGenerator kpg = KeyPairGenerator.getInstance(ALGORITHM); //RSA算法创建KeyPairGenerator对象 kpg.initialize(KEYSIZE, sr); //随机数据源初始化KeyPairGenerator对象 KeyPair kp = kpg.generateKeyPair(); //生成密匙对 Key publicKey = kp.getPublic(); //得到公钥 Key privateKey = kp.getPrivate(); //得到私钥 ObjectOutputStream ois = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE)); //用对象流将生成的密钥写入文件 ois.writeObject(publicKey); ois.close(); ois = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE)); ois.writeObject(privateKey); ois.close(); } /** * 加密方法 * @param source 源数据 * @return */ public static String encrypt(String source) throws Exception { generateKeyPair(); ois = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE)); Key key = (Key) ois.readObject(); ois.close(); Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] b = source.getBytes(); b = cipher.doFinal(b); BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(b); } /** * 解密算法 * @param cryptograph * @return * @throws Exception */ public static String decrypt(String cryptograph) throws Exception { ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE)); Key key = (Key) ois.readObject(); Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, key); BASE64Decoder decoder = new BASE64Decoder(); byte[] b = decoder.decodeBuffer(cryptograph); b = cipher.doFinal(b); return new String(b); } public static void main(String[] args) throws Exception { String source = "Hello World!";// 要加密的字符串 String cryptograph = encrypt(source);// 生成的密文 System.out.println(cryptograph); String target = decrypt(cryptograph);// 解密密文 System.out.println(target); } }