14

RSA非对称加密之PHP生成pem公钥私钥对及使用的两个实例

PHP生成pem公钥私钥对

如果不能生成密钥对,则修改验证变量$confs数组中的config值。

最初我不能生成公钥,是因为函数openssl_pkey_export(),只使用一前面两个参数,后台增加了后面两个参数就可以了。原因是:因为openssl_pkey_new($confs)中使用了$confs,那么函数openssl_pkey_export()也必须加入参数$confs。

实例一:

公钥加密(openssl_public_encrypt),
私钥解密(openssl_private_decrypt)。
私钥加密(openssl_private_encrypt),
公钥解密(openssl_public_decrypt)。
都是一个道理,代码类似。

RSA加密解密有个填充方式padding的参数,不同编程语言之间交互,需要注意这个。

padding can be one of OPENSSL_PKCS1_PADDINGOPENSSL_SSLV23_PADDINGOPENSSL_PKCS1_OAEP_PADDING,OPENSSL_NO_PADDING

值得注意的是,如果选择密钥是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);

 

实例二:

明文超出长度的代码(前提是1024bit的密钥长,OPENSSL_PKCS1_PADDING的填充方式,否则数字要变化)

在实际应用中,分析使用场景,再把两个实例再进行一下结合,相信就会更加美妙了,这里就不多写了。

PHP加密函数 sha256 sha512 sha256_file() sha512_file()