如何在PHP中加密长字符串?

问题描述 投票:11回答:3

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

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

php rsa public-key-encryption
3个回答
4
投票

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


6
投票

使用PKCS1填充的RSA只允许您执行密钥长度的字符串(以字节为单位) - 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相同的操作。

希望有所帮助!


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版本,因为它不再受支持),并且我不会在PHP上使用RC4作为密码方法允许我选择密码方法的版本。

© www.soinside.com 2019 - 2024. All rights reserved.