如何使用linux openssl解密PHP AES-256-ecb加密数据?



我想使用Linux预安装的openssl命令行工具解密AES加密的json文件,但我不知道如何设置Linux的openssl的正确标志。加密码是由另一方提供的,不能更改。因为我的环境不支持PHP,所以我必须实现一个linux版本。有人知道怎么解决这个问题吗?

下面是另一方提供的加密和我实现的解密过程的详细描述。

加密过程

function openssl_encrypt_data($data, $cipher_algo, $key, $options = OPENSSL_RAW_DATA , $iv = NULL) {
try {
$encryptstr = base64_encode(openssl_encrypt($data, $cipher_algo, $key, $options, $iv));
return $encryptstr;
} catch (Exception $e) {
}
}
$aes_key = "b4396c8cd9b16b0d86604d6d3787bc12fe2af4c6401c23ec35db84d8392565b9190c0db1543e7be967240348d6d86d037e34042476509c786aa78dce706a620c";
// This is a super large json file. 
$original_data = '{
"item": [
{
"submitId": "AG113560102",
"submitDate": "2022-05-09 15:56:10",
"age": "1",
"workType": "12",
"workTitle": "5", ...
"agreeSales": true,
"agreeScrivener": true}]}'
echo openssl_encrypt_data($original_data, "aes-256-ecb", $aes_key);

脚本生成以下Base64字符串:

7 w2onyajbf1bclqztiowuhm4o9exakida8fq0/Ls2ahRKPZ5WD1iHxshoBPLYGNxGi3IF2RZ5z2xHxTkb SuJ5U5zYgYiiLaGObHCnMwudghUlaSo5dcgpHaycqoo8NuB8P3iDTWV + gGPif14ImxX/8 rgjjbb5xz0cdcyzkjhvsddabw2oozqoteikk9zk6uancsdome7yze17s1yl757n1pxm2jeedgu + kxxRZzBEu9dBDswIQMsyy4mf0oKqB3yxVsybcTkoHAd/cCCCr1drI1/AolwktVbLlxiLVV1H79dr + Xom…

解密过程

openssl aes-256-ecb -d -K b4396c8cd9b16b0d86604d6d3787bc12fe2af4c6401c23ec35db84d8392565b9190c0db1543e7be967240348d6d86d037e34042476509c786aa78dce706a620c -in input.txt -out recover.json

不幸的是,这个脚本产生了以下错误:

十六进制字符串太长,忽略多余部分坏的解密140157171651584:错误:0606506D:数字信封例程:EVP_DecryptFinal_ex:错误的最终块长度:crypto/evp/evp_encs .c:599:

我还尝试在脚本上使用-nopad标志:

openssl aes-256-ecb -nopad -d -K b4396c8cd9b16b0d86604d6d3787bc12fe2af4c6401c23ec35db84d8392565b9190c0db1543e7be967240348d6d86d037e34042476509c786aa78dce706a620c -in input.txt -out recover.json

脚本运行成功,没有引发错误,但是恢复失败。创建的Json文件无法成功加载:

恢复。json不是UTF-8编码的

我将标志改为-base64标志,但它也不起作用。

openssl aes-256-ecb -d -base64 -K b4396c8cd9b16b0d86604d6d3787bc12fe2af4c6401c23ec35db84d8392565b9190c0db1543e7be967240348d6d86d037e34042476509c786aa78dce706a620c -in input.txt -out recover.json

十六进制字符串太长,忽略多余部分坏的解密140157171651584:错误:0606506D:数字信封例程:EVP_DecryptFinal_ex:bad decrypto: crypto/evp/evp_encs .c:599:

以上脚本都不起作用。有人知道这是怎么回事吗?

经过一番讨论,我想到了一个解决方案。下面是工作解密过程:

  1. 将加密的base64文本存储在文件input.txt

  2. 打开input.txt,每64个字符新建一行,并在末尾新建一行(您也可以使用程序为每64个字符添加'n')。

  3. 将十六进制aes密钥存储在名为aes_key.txt的文件中。

  4. 使用程序(例如python)打开uft-8字节的aes_key.txt,并使用十六进制编码对其进行编码。

with open('aes_key.txt', 'r') as f:
aes_key = f.read().encode('utf-8')
import binascii
hex_encoded_hex_aes_key = binascii.hexlify(aes_key).decode('utf-8')
with open('hex_encoded_hex_aes_key.txt', 'w') as f:
f.write(hex_encoded_hex_aes_key)
  1. 在Linux openssl解密命令中使用hex_encoded_hex_aes_key.txt中存储的字符串
openssl aes-256-ecb -d -base64 -K <hex_encoded_hex_aes_key> -in input.txt -out recover.json

最新更新