【问题标题】:How to encrypt long strings in PHP?如何在 PHP 中加密长字符串?
【发布时间】:2011-09-10 19:15:57
【问题描述】:

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

如何让它加密任意长度的数据?

【问题讨论】:

    标签: php rsa public-key-encryption


    【解决方案1】:

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

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

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

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

    希望有帮助!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您可以:

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

        第一个实现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 版本上。

        【讨论】:

          猜你喜欢
          • 2013-06-11
          • 2010-12-19
          • 1970-01-01
          • 2010-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-08
          相关资源
          最近更新 更多