我正在使用 PHP 的 openssl_public_encrypt() 来使用 RSA 加密数据。但它不会加密大于一定大小的数据。
我怎样才能让它加密任意长度的数据?
我正在使用 PHP 的 openssl_public_encrypt() 来使用 RSA 加密数据。但它不会加密大于一定大小的数据。
我怎样才能让它加密任意长度的数据?
RSA,使用 PKCS1 填充,只允许您执行长度为密钥(以字节为单位)的字符串 - 11。这不是 OpenSSL 或 PHP 限制,而是 RSA 限制。
如果您想使用 openssl_* 函数集来处理更长的字符串,请使用openssl_seal和openssl_open。openssl_seal 生成一个随机字符串,使用 RSA 对其进行加密,然后使用前面提到的随机字符串作为密钥对您实际尝试使用 RC4 加密的数据进行加密。
phpseclib 是一个纯 PHP RSA 实现,采用了不同的方法。如果您坚持加密大于 RSA 密钥的字符串,它将将该字符串拆分为 RSA 可以处理的最大大小的块,然后将结果连接起来。
phpseclib OpenSSL 互操作性页面讨论了如何使用 phpseclib 执行与 openssl_seal / openssl_open 相同的操作。
希望有帮助!
php.net 页面对这个问题有很好的提示(像往常一样)http://www.php.net/manual/en/function.openssl-public-encrypt.php#95307
您可以:
第一个实现混合密码系统。使用 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 作为密码方法这允许我选择密码方法。