我一直在绞尽脑汁。我正在使用最新版本的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 /私钥加密/解密并添加填充之前,我遇到了这个问题,该方法可以正常工作,但是如果文本较长,就不会加密/解密。...
任何帮助都会很棒...
答案 0 :(得分:2)
我可以使rsa处理短文本,但是长文本似乎不起作用。
这是预期的。 RSA仅在短输入上运行。如果要使用RSA加密长消息,则需要执行以下两项操作之一:
因此,您最终得到这样的东西:
k
。k
,以获取C
。C
,k
)以获取消息密钥m
。P
对消息(m
)进行加密,以获取D
。C
和D
。k'
。C
,以获得k
(一次性AES密钥)。k
换成k'
。C
,k
)以获取消息密钥m
。D
解密m
。我阅读使用openssl_seal / open ..当我在测试页上演示代码时,它工作得很好..当我将其与mysql一起实践时,它无法按预期的方式工作。.
首先,考虑using libsodium instead。
无论您是否继续使用OpenSSL,您都可能希望对输出进行base64编码(并确保将数据存储在文本字段中,而不是简短的varchar中)。