首页 > 解决方案 > PHP RSA加密openssl问题

问题描述

我一直在绞尽脑汁。我正在使用最新版本的 php 7。我可以让 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 并存储到 blobs/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/private 密钥加密/解密并添加填充之前,我遇到了这个问题,这有效,但是对于长文本,它不会加密/解密......

任何帮助都会很棒...

标签: phpencryptionopensslrsa

解决方案


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

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

  1. 将您的消息分成几个不同的块并分别加密。这是缓慢、低效和不安全的。(攻击者可以丢弃或重新排序块。)
  2. 使用结合 RSA 和 AES 的安全结构,就像这样

因此,你最终会得到这样的结果:

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

我读到使用openssl_seal/open ..当我在测试页面上演示代码时效果很好..当我用mysql将它付诸实践时,它没有按预期的方式工作..

首先,考虑改用 libsodium

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


推荐阅读