關於手冊中 openssl_private_encrypt 中 [P.Peyremorte] 的註解的一點小註解。
「- openssl_private_encrypt 一次最多可加密 117 個字元。」
這取決於 $key 的長度
– 對於 1024 位元金鑰長度 => 要加密的最大字元數 (位元組) = 1024/8 - 11 (當使用填充時) = 117 個字元 (位元組)。
– 對於 2048 位元金鑰長度 => 要加密的最大字元數 (位元組) = 2048/8 - 11 (當使用填充時) = 245 個字元 (位元組)。
... 等等
順帶一提,如果 openssl_private_encrypt 因為資料大小而失敗,您只會得到 false 作為回傳值,openssl_public_decrypt() 在解密時也是如此。
「- 加密輸出字串的長度始終為 129 個字元。如果您在加密輸出上使用 base64_encode,則將始終給出 172 個字元,最後一個始終為 "=" (填充物)」
這再次取決於 $key 的長度
– 對於 1024 位元金鑰長度 => 原始位元組的加密數始終是 RSA 設計的 128 位元組 (1024 位元) 區塊。
– 對於 2048 位元金鑰長度 => 原始位元組的加密數始終是 RSA 設計的 256 位元組 (2048 位元) 區塊。
... 等等
關於 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;
}
?>