如何获取openssl_public_encrypt可以加密的最大位数?

时间:2017-02-22 09:54:30

标签: php encryption openssl cryptography

我知道在使用openssl_public_encrypt加密数据时,您无法加密任何大于密钥大小的内容。其他人也在PHP文档说明中对此进行了备份:

http://php.net/manual/en/function.openssl-public-encrypt.php#55901

现在我想抛出一个异常,当有人仍然试图这样做时,我正在弄清楚我的钥匙的大小:

$keyDetails = openssl_pkey_get_details($this->public);
$bytes = $keyDetails['bits'] / 8; 

这为我提供了我可用的总位数,但这没有考虑填充。我希望能够动态抛出此异常,因此我想要考虑不同大小的公钥。

从PHP文档中已有人注意到:

  

但是,OpenSSL使用的PKCS#1标准指定了一个填充方案(因此您可以加密较小的数量而不会失去安全性),并且该填充方案至少需要11个字节(如果值为你,它将会更长) '加密更小)。

因此,对于PKCS#1标准,我丢失了11 * 8位,这意味着我只能使用1024位密钥加密最大大小为936位的内容。

除了我没有使用这个标准。我正在使用OPENSSL_PKCS1_OAEP_PADDING。我不知道11个字节来自哪里我在定义这些常量的PHP代码中找不到它。

如何查找标准的填充,以及我可以加密的最大大小。

即使填充可能会根据“要加密”值的大小而改变,但我想在这种情况下设置一个硬性下限(如果是这种情况则不完全确定)。

干杯。

1 个答案:

答案 0 :(得分:2)

OAEP 填充使用42个字节的可用空间。