【发布时间】:2019-07-19 22:31:48
【问题描述】:
我正在尝试计算一个 PHP 函数以使 3DES(三重 DES)处于 ECB 模式。但我得到了错误的结果。
我的结果:615EDC0E8EAD5DDE
预期结果:7B66D9A5010A8035
(预期结果用HSM计算,并与网站确认)http://tripledes.online-domain-tools.com/
这是我的 PHP 函数,作为参数:
$data = "3200000025381234"
$key = "98137332E06BBA25AEE51CFD150EA8E3"
function tripleDES($data, $key) {
$key= hex2bin($key);
$data = hex2bin($data);
$enc = openssl_encrypt($data, 'des-ede3', $key, OPENSSL_RAW_DATA |
OPENSSL_ZERO_PADDING);
return strtoupper(bin2hex($enc));
}
我做错了什么?
【问题讨论】:
-
您还应该提供预期值的计算方式。查看类似问题OpenSSL des-ede3-cbc Decryption php
-
在 PHP 中,3DES 必须使用 24 字节的密钥。由于您的密钥有 16 个字节,因此使用 Keying option 2 (2TDEA):
K1, K2, K3 = K1,因此对于 PHP,密钥是:98137332E06BBA25AEE51CFD150EA8E398137332E06BBA25,它提供了预期的结果。通过使用0-values 填充,较短的键隐式扩展到 24 字节,这会产生不同的结果。 -
请注意,关键数据的扩展(或修剪)特定于 PHP。这被认为是非常糟糕的做法 - 不应扩展或修剪密钥。唯一更糟糕的是 OpenSSL / C,你只需要一个指针并希望那里有一个 16/24/32 字节的密钥。
标签: php cryptography 3des