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生成公钥。

4eb0b74a4619e968344d39654cf09c7d.png

之后便可以在bin文件夹下用文本类应用打开查看私钥和公钥。

这样就生成了密钥,但是这种密钥对的私钥无法直接在代码中使用,要想使用它需借助RSAPrivateStructure这个类,java是不自带的。因此为了方便使用,我们需要对私钥进行PKCS#8编码,命令如下:

pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐