我正在使用PHP的openssl_public_encrypt()来使用RSA加密数据。但它不会加密大于特定大小的数据。
如何让它加密任意长度的数据?
php.net页面有一个很好的暗示这个问题(像往常一样)http://www.php.net/manual/en/function.openssl-public-encrypt.php#95307
使用PKCS1填充的RSA只允许您执行密钥长度的字符串(以字节为单位) - 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相同的操作。
希望有所帮助!
你可以:
第一个实现了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版本,因为它不再受支持),并且我不会在PHP上使用RC4作为密码方法允许我选择密码方法的版本。