PHP RSA加密openssl问题

时间:2019-05-27 23:19:20

标签: php encryption openssl rsa

我一直在绞尽脑汁。我正在使用最新版本的php7。我可以使rsa使用短文本,但是长文本似乎不起作用。我读过使用openssl_seal / open ..当我在测试页上演示代码时,它工作得很好..当我将其与mysql一起实践时,它无法按预期的方式工作。

加密代码:

$messageiv = openssl_random_pseudo_bytes(32);
openssl_seal($_POST[$_SESSION['message']], $encryptedmessage, $ekeys, array($_SESSION['recipient_publickey']), "AES256", $messageiv);
openssl_seal($_POST[$_SESSION['subject']], $encryptedsubject, $ekeys, array($_SESSION['recipient_publickey']), "AES256", $messageiv);

然后将上面的内容进行base91_encoded编码并存储到blob / varchar中。

解密

openssl_open(base91_decode($row['messagesubject']), $decryptedsubject, $ekeys[0], $_SESSION['privatersakey'], "AES256", base91_decode($row['messageiv']));              
    openssl_open(base91_decode($row['messagebody']), $decryptedbody, $ekeys[0], $_SESSION['privatersakey'], "AES256", base91_decode($row['messageiv']));

以上变量$ decryptedsubject和$ decryptedmessage为空。

在使用openssl_public /私钥加密/解密并添加填充之前,我遇到了这个问题,该方法可以正常工作,但是如果文本较长,就不会加密/解密。...

任何帮助都会很棒...

1 个答案:

答案 0 :(得分:2)

  

我可以使rsa处理短文本,但是长文本似乎不起作用。

这是预期的。 RSA仅在短输入上运行。如果要使用RSA加密长消息,则需要执行以下两项操作之一:

  1. 将您的消息分成几个不同的块,然后分别对其进行加密。这是缓慢,低效和不安全的。 (攻击者可以删除或重新排序块。)
  2. 使用结合了RSA和AES like so的安全构造。

因此,您最终得到这样的东西:

  • 加密
    1. 生成随机的32字节密钥k
    2. 使用您的RSA公钥加密k,以获取C
    3. 计算HMAC-SHA256(Ck)以获取消息密钥m
    4. 使用AES-256-GCM使用P对消息(m)进行加密,以获取D
    5. 返回CD
  • 解密
    1. 生成一个随机的虚拟密钥,我们将其称为k'
    2. 使用您的RSA私钥解密C,以获得k(一次性AES密钥)。
    3. 如果第2步失败,请使用固定时间算法将k换成k'
    4. 计算HMAC-SHA256(Ck)以获取消息密钥m
    5. 使用D解密m
    6. 返回解密的纯文本(或由于身份验证标签而失败)。
  

我阅读使用openssl_seal / open ..当我在测试页上演示代码时,它工作得很好..当我将其与mysql一起实践时,它无法按预期的方式工作。.

首先,考虑using libsodium instead

无论您是否继续使用OpenSSL,您都可能希望对输出进行base64编码(并确保将数据存储在文本字段中,而不是简短的varchar中)。