【问题标题】:Cannot find the right 3DES cipher in PHP在 PHP 中找不到正确的 3DES 密码
【发布时间】: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


【解决方案1】:

感谢 Topaco 的回答,我明白了我的错误。 所以我使用了这个 github 项目:https://github.com/gilfether/phpcrypt 并以这种方式更正了我的代码(使用我的 16 字节密钥):

function triple_DES($data, $key){
   $key = hex2bin($key);
   $data = hex2bin($data);
   $crypt = new PHP_Crypt($key, PHP_Crypt::CIPHER_3DES, PHP_Crypt::MODE_ECB);
   $encrypt = $crypt->encrypt($data);

   return strtoupper(bin2hex($encrypt));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-19
    • 2016-01-27
    • 2020-10-13
    相关资源
    最近更新 更多