12

我正在使用 PHP 的 openssl_public_encrypt() 来使用 RSA 加密数据。但它不会加密大于一定大小的数据。

我怎样才能让它加密任意长度的数据?

4

3 回答 3

6

RSA,使用 PKCS1 填充,只允许您执行长度为密钥(以字节为单位)的字符串 - 11。这不是 OpenSSL 或 PHP 限制,而是 RSA 限制。

如果您想使用 openssl_* 函数集来处理更长的字符串,请使用openssl_sealopenssl_open。openssl_seal 生成一个随机字符串,使用 RSA 对其进行加密,然后使用前面提到的随机字符串作为密钥对您实际尝试使用 RC4 加密的数据进行加密。

phpseclib 是一个纯 PHP RSA 实现,采用了不同的方法。如果您坚持加密大于 RSA 密钥的字符串,它将将该字符串拆分为 RSA 可以处理的最大大小的块,然后将结果连接起来。

phpseclib OpenSSL 互操作性页面讨论了如何使用 phpseclib 执行与 openssl_seal / openssl_open 相同的操作。

希望有帮助!

于 2013-06-14T16:10:39.690 回答
4

php.net 页面对这个问题有很好的提示(像往常一样)http://www.php.net/manual/en/function.openssl-public-encrypt.php#95307

于 2011-06-08T11:33:03.990 回答
0

您可以:

  • 使用对称加密方法加密数据,使用随机密钥,然后使用非对称加密方法的公钥加密(使用公钥加密的随机密钥对于解密数据的用户是必需的。)
  • 将数据拆分为非对称加密方法处理的大小的块后,使用非对称加密方法加密数据

第一个实现混合密码系统。使用 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 作为密码方法这允许我选择密码方法。

于 2019-02-12T12:05:06.107 回答