【发布时间】:2011-09-10 19:15:57
【问题描述】:
我正在使用 PHP 的 openssl_public_encrypt() 来使用 RSA 加密数据。但它不会加密大于一定大小的数据。
如何让它加密任意长度的数据?
【问题讨论】:
标签: php rsa public-key-encryption
我正在使用 PHP 的 openssl_public_encrypt() 来使用 RSA 加密数据。但它不会加密大于一定大小的数据。
如何让它加密任意长度的数据?
【问题讨论】:
标签: php rsa public-key-encryption
RSA,使用 PKCS1 填充,只允许您执行长度为密钥长度(以字节为单位) - 11 的字符串。这不是 OpenSSL 或 PHP 限制,而是 RSA 限制。
如果您想使用 openssl_* 函数集处理更长的字符串,请使用 openssl_seal 和 openssl_open。 openssl_seal 生成一个随机字符串,使用 RSA 对其进行加密,然后使用前面提到的随机字符串作为密钥,使用 RC4 对您实际尝试加密的数据进行加密。
phpseclib, a pure PHP RSA implementation,采用不同的方法。如果您坚持加密大于 RSA 密钥的字符串,它将将该字符串拆分为 RSA 可以处理的最大大小的块,然后将结果连接起来。
phpseclib OpenSSL Interoperability 页面讨论了如何使用 phpseclib 执行与 openssl_seal / openssl_open 相同的操作。
希望有帮助!
【讨论】:
php.net 页面对这个问题有很好的提示(和往常一样)http://www.php.net/manual/en/function.openssl-public-encrypt.php#95307
【讨论】:
您可以:
第一个实现hybrid cryptosystem。使用 PHP 和 openSSL 扩展,您可以使用 openssl_seal(),它(自 PHP 5.3.0 起)允许设置密码方法(默认为 RC4)和(自 PHP 7.0.0 起)初始化向量。如果您不使用 PHP 7.x,或者您想编写与 PHP 5.3.3 及更高版本兼容的代码,并且您希望能够初始化向量,您可以
使用openssl_random_pseudo_bytes()生成随机密钥,openssl_encrypt()加密数据,openssl_public_encrypt()加密随机密钥。
我不会将openssl_seal() 与不允许我设置密码方法的 PHP 版本一起使用(但是,我不会使用那个 PHP 版本,因为它不再受支持),我不会使用 RC4 作为密码方法,在允许我选择密码方法的 PHP 版本上。
【讨论】: