【问题标题】:Decrypting a PHP generated OpenSSL string in Terminal在终端中解密 PHP 生成的 OpenSSL 字符串
【发布时间】:2017-12-12 08:16:39
【问题描述】:

这个问题是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 函数的输出,它会引发错误:

错误的解密 140735624655752:错误:06065064:数字信封例程:EVP_DecryptFinal_ex:错误解密:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22/libressl/crypto/evp/evp_enc.c:529:

在 SO 上研究了thisthat 和类似问题后,我很困惑为什么错误不断发生。 我相信这是因为keyiv的编码(注意我在PHP中使用了hex2bin()),如果不使用会产生不同的结果。

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

【问题讨论】:

    标签: php encryption terminal cryptography


    【解决方案1】:

    就像您的上一个问题一样,您在编码方面有点挣扎。如果您仔细查阅 openssl_encrypt 的文档,您会注意到密钥和 IV 都应该作为原始值传递,而不是十六进制。

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2016-04-10
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      相关资源
      最近更新 更多