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

标签 php encryption terminal cryptography

这个问题有助于 my previous question 的第二部分.
我遇到过其他有类似问题的帖子,但由于 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;
}
?>

返回:6Q7DM7VGEeJdnGf2h9k1Kg==

我的问题非常简单:将上述结果转回纯文本的终端解密等效项是什么?

到目前为止,我能够在 AppleScript 中使用以下终端命令(为了更快地操作变量),但 do shell script内容为终端代码:

set encKey to "B374A26A71490437AA024E4FADD5B497FDFF1A8EA6FF12F6FB65AF2720B59CCF"
set encIV to "61736466673534336173646667353433"
set stringToEnc to "my plain text string"

set encrypted to (do shell script "echo '" & stringToEnc & "' | openssl enc -aes-256-cbc -a -K " & encKey & " -iv " & encIV)
set decrypted to (do shell script "echo '" & encrypted & "' | openssl enc -aes-256-cbc -a -d -K " & encKey & " -iv " & encIV)

但是,虽然这按原样工作,但设置 encrypted (在上面的脚本中)到 PHP 函数的输出,它会抛出错误:

bad decrypt 140735624655752:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22/libressl/crypto/evp/evp_enc.c:529:

已学习this , that以及类似的问题,我很困惑为什么错误不断发生。 我相信这是因为 key 的编码和iv (请注意,我在 PHP 中使用了 hex2bin()),如果不使用,将会产生不同的结果。

我的终端命令中缺少什么?如果有人可以帮助我计算出解密等价物,我将非常感谢您的帮助。

最佳答案

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

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

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

所以,总而言之,最终的命令是这样的,它只给出字节 0x70 的输出,我认为这是正确的:

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

这假设 input.bin 是您提供的 Base64 密文的 Base64 解码二进制文件。

关于php - 在终端中解密 PHP 生成的 OpenSSL 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47768006/

相关文章:

php - 在用 phpmailer 发送邮件时它也发送 github,如何删除它?

encryption - Erlang Crypto 新 API crypto_one_time/5 不接受选项 : [{encrypt, true}]

c - 在 C 中获取用户的连续输入

node.js - 全局 Node 模块未正确安装。找不到相关命令

php - MySQL UPDATE 使用目标表

php - 如何解决active record $this->db->insert()实现一条 ‘INSERT IGNORE INTO’语句?

algorithm - 密码学:虚拟属性(property)所有权的数字签名?

c# - 解密加密文本

git - 强制 "git status"在终端上输出颜色(在脚本内)

javascript - Highcharts xaxis 偏离了几个小时