RSA算法经常用于少量数据加密,具有安全性高但是速度较慢的优缺点,这是一种非对称密码算法,所谓非对称,即是指该算法加密需要一对密钥,一个密钥用于加密,一个密钥用于解密。其安全性基于大数分解的难度
RSA算法涉及到三个参数:n,e1,e2:
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n,e1),(n,e2)就是密钥对。其中(n,e1)为公钥,(n,e2)为私钥。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e2 mod n;B=A^e1 mod n;(公钥加密体制中,一般用公钥加密,私钥解密)
e1和e2可以互换使用,即:
A=B^e1 mod n;B=A^e2 mod n;
RSA生成密钥对
第一种方法:代码中生成随机密钥对
/**
* 生成随机密钥对
* @param keyLength 通常为512或者1024位长度
* @return
*/
public static KeyPair generateRSAKeyPair(int keyLength) {
try {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(keyLength);
return kpg.genKeyPair();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
KeyPair kp = generateRSAKeyPair(1024);
PrivateKey kp_private = kp.getPrivate();
PublicKey kp_public = kp.getPublic();第二种方法:通过openSSL工具生成密钥对
genrsa -out rsa_private_key.pem 1024生成私钥
rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout生成公钥。
之后便可以在bin文件夹下用文本类应用打开查看私钥和公钥。
这样就生成了密钥,但是这种密钥对的私钥无法直接在代码中使用,要想使用它需借助RSAPrivateStructure这个类,java是不自带的。因此为了方便使用,我们需要对私钥进行PKCS#8编码,命令如下:
pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt