openssl 生成秘钥公钥

阅读更多

 

 

1.生成秘钥:(生成1024位的私钥,不指定的话默认2048位)

openssl genrsa -out rsa_private_key.pem 1024

 

2.生成公钥:(根据这个私钥生成公钥)

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

 

3.生成PKCS8 编码的私钥

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

屏幕会出输出一段字符串,把它复制到文本文件中保存成 pkcs8_rsa_private_key.pem 以后该文件就是私钥

 

然后可以用 PHP 公钥加密 ,私钥解密

 

 

值得注意的是,如果选择密钥是1024bit长的(openssl genrsa -out rsa_private_key.pem 1024),那么支持加密的明文长度字节最多只能是1024/8=128byte;

如果加密的padding填充方式选择的是OPENSSL_PKCS1_PADDING(这个要占用11个字节),那么明文长度最多只能就是128-11=117字节。如果超出,那么这些openssl加解密函数会返回false。

 

这时有个解决办法,把需要加密的源字符串按少于117个长度分开为几组,在解密的时候以172个字节分为几组。

其中的『少于117』(只要不大于117即可)和『172』两个数字是怎么来的,值得一说。

为什么少于117就行,因为rsa encrypt后的字节长度是固定的,就是密钥长1024bit/8=128byte。因此只要encrypt不返回false,即只要不大于117个字节,那么返回加密后的都是128byte。

172是因为什么?因为128个字节base64_encode后的长度固定是172。

这里顺便普及下base64_encode。encode的长度是和原文长度有个计算公式:

$len2 = $len1%3 >0 ? (floor($len1/3)*4 + 4) : ($len1*4/3);

你可能感兴趣的:(openssl 生成秘钥公钥)