在终端中解密PHP生成的OpenSSL字符串

在终端中解密PHP生成的OpenSSL字符串,php,encryption,terminal,cryptography,Php,Encryption,Terminal,Cryptography,这个问题作为第二部分有助于解决问题。 我遇到过其他线程有类似的问题,但由于PHP最近的变化(即mcrypt的删除),我正在寻求一些建议,以确定我最好如何在2017/18年使用OpenSSL解决这个问题。 我在PHP脚本中设计了以下函数。它接受纯文本字符串并对其进行加密 <?php function encrypt( $myString) { $data = $myString; $key = 'B374A26A71490437AA024E4FADD5B497FDFF1A8E

这个问题作为第二部分有助于解决问题。
我遇到过其他线程有类似的问题,但由于PHP最近的变化(即mcrypt的删除),我正在寻求一些建议,以确定我最好如何在2017/18年使用OpenSSL解决这个问题。

我在PHP脚本中设计了以下函数。它接受纯文本字符串并对其进行加密

<?php
function encrypt( $myString) {
    $data = $myString;
    $key = 'B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF';
    $iv = '61736466673534336173646667353433';

    $encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, 0, hex2bin($iv));
    return $encrypted;
}
?>
但是,尽管这可以按原样工作,但将
加密的
(在上面的脚本中)设置为PHP函数的输出,它会抛出错误:

解密错误 140735624655752:错误:06065064:数字信封例程:EVP_decrypt final_ex:错误解密:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22/libressl/crypto/EVP/EVP_enc.c:529:

经过研究,以及类似的问题,我不明白为什么错误不断发生。 我相信这是因为
iv
的编码(注意,我在PHP中使用了
hex2bin()
),如果不使用,将产生不同的结果


我的终端命令缺少什么?如果有人能帮我找到解密等价物,我将非常感谢你的帮助。

就像你的最后一个问题一样,你在编码方面有点困难。如果您仔细查阅有关的文档,您会注意到key和IV都应该作为原始值传递,而不是十六进制

您在使用IV的代码中正确地执行了此操作,但没有使用密钥。您将该键作为十六进制值传递,这意味着它的长度是所需长度的两倍。在本例中,仅使用密钥的前256位,即B374A26A71490437AA024E4FADD5B497,因为您总共传递了512位密钥材料

所以我们知道,当ASCII编码时,我们的原始密钥是
B374A26A71490437AA024E4FADD5B497
,正好是256位。然而,我在您的第一个问题中讨论的OpenSSL-K标志要求传递十六进制编码的密钥,这意味着我们需要对密钥进行十六进制编码。因此,我们对B374A26A71490437AA024E4FADD5B497进行十六进制编码,以获得实际的十六进制编码加密密钥

总之,最后一个命令是这样的,它只给出字节0x70的输出,我认为这是正确的:

openssl enc -d -K 4233373441323641373134393034333741413032344534464144443542343937 -iv 61736466673534336173646667353433 -in input.bin -out out.bin
这假定input.bin是您提供的base64密文的base64解码二进制文件

openssl enc -d -K 4233373441323641373134393034333741413032344534464144443542343937 -iv 61736466673534336173646667353433 -in input.bin -out out.bin