使用十六进制密钥从十六进制数据中解密 3des

Decrypting 3des from hex data with a hex key

我正在尝试使用 mycrypt php 库解密以下内容:

Key: aaaaaaaabbbbbbbbccccccccdddddddd

Data: b5057bbc04b842a96144a0f617f2820e

Expected Result: Test123123

数据使用 ECB 模式的 3DES 加密。我目前正在使用的代码将十六进制值解密为 "e2119b734b5050e3",转换为“â›sKPPã”。我尝试使用返回 "False" 的 open ssl。

代码如下:

(PHP 版本 5.3.3)

$key = 'aaaaaaaabbbbbbbbccccccccdddddddd';
$key = pack('H*',$key);

// DATA
$data = 'b5057bbc04b842a96144a0f617f2820e';
$data = pack('H'.strlen($key),$data);

// DECRYPT MCRYPT
$data = rtrim(mcrypt_decrypt(MCRYPT_3DES, $key, $data, MCRYPT_MODE_ECB), "[=10=]");
$decryptedHex = unpack('H*',$data);

// DECRYPT OPEN SSL (RETURNS FALSE)
$result = openssl_decrypt($data,'des-ede3', $key);

// ECHO
echo $decryptedHex[1];

这里的问题是缺少太多信息——3DES 的确切变体,填充信息。稍微摆弄一下加密选项,而不是解密,可以尝试生成密文以找到正确的选项。结果是

openssl_encrypt($ptext,'des-ede', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING)

其中 $ptext"Test123123[=13=][=13=][=13=][=13=][=13=][=13=]"

密文同样可以通过

解密
$result = openssl_decrypt($data,'des-ede', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING);

您将需要升级到 PHP 的更新且受支持(PHP 5.3 于 2009 年发布,自 2015 年起不再受支持)版本。