只是在 openssl_private_encrypt 手册中的 [P.Peyremorte] 的备注中作一个小小的补充。
“- openssl_private_encrypt 一次最多能加密 117 个字符”。
这取决于 $key 的长度
- 对于长度为 1024 bit 的密钥 => 可加密的最大字符(字节)数 = 1024/8 - 11(使用填充时)= 117 个字符(字节)。
- 对于长度为 2048 bit 的密钥 => 可加密的最大字符(字节)数 = 2048/8 - 11(使用填充时)= 245 个字符(字节)。
... 等等
顺便说一下,如果 openssl_private_encrypt 因数据大小而失败,您不会得到任何东西,只会得到 false 作为返回值,解密时的 openssl_public_decrypt() 也是如此。
“- 加密后的输出字符串始终为 129 个字符。如果您对加密后的输出使用 base64_encode,它始终会给出 172 个字符,最后一个始终为“=”(填充符)”
这又取决于 $key 的长度
- 对于长度为 1024 bit 的密钥 => 根据 RSA 设计,加密的原始字节数始终是一个 128 字节(1024 bit)块。
- 对于长度为 2048 bit 的密钥 => 根据 RSA 设计,加密的原始字节数始终是一个 256 字节(2048 bit)块。
... 等等
关于 base64_encode 输出长度,它取决于您编码的内容(即它取决于加密后产生的字节),但通常情况下,产生的编码字符串将大约大 33%(对于 128 字节约 170 字节,对于 256 字节约 340 字节)。
然后我将对 [P.Peyremorte] 的注释进行一点概括
<?php
private $ENCRYPT_BLOCK_SIZE = 200;private $DECRYPT_BLOCK_SIZE = 256;function encrypt_RSA($plainData, $privatePEMKey)
{
$encrypted = '';
$plainData = str_split($plainData, $this->ENCRYPT_BLOCK_SIZE);
foreach($plainData as $chunk)
{
$partialEncrypted = '';
$encryptionOk = openssl_private_encrypt($chunk, $partialEncrypted, $privatePEMKey, OPENSSL_PKCS1_PADDING);
if($encryptionOk === false){return false;}$encrypted .= $partialEncrypted;
}
return base64_encode($encrypted);}
protected function decrypt_RSA($publicPEMKey, $data)
{
$decrypted = '';
$data = str_split(base64_decode($data), $this->DECRYPT_BLOCK_SIZE);
foreach($data as $chunk)
{
$partial = '';
$decryptionOK = openssl_public_decrypt($chunk, $partial, $publicPEMKey, OPENSSL_PKCS1_PADDING);
if($decryptionOK === false){return false;}$decrypted .= $partial;
}
return $decrypted;
}
?>