我正在使用PHP的openssl_public_encrypt()来使用RSA加密数据。但它不会加密大于一定大小的数据。
如何让它加密任意长度的数据?
答案 0 :(得分:6)
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相同的操作。
希望有所帮助!
答案 1 :(得分:4)
php.net页面提供了一个很好的解决这个问题的提示(像往常一样)http://www.php.net/manual/en/function.openssl-public-encrypt.php#95307
答案 2 :(得分:0)
您可以:
第一个实现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版本上允许我选择密码方法。