【问题标题】:Key of size 7 not supported by this algorithm. Only keys of size 24 supported此算法不支持大小为 7 的密钥。仅支持大小为 24 的键
【发布时间】:2018-07-11 16:57:16
【问题描述】:

我正在使用mcrypt_encrypt 函数,它返回空值。 我的代码是:

$secret = 'der102rtv1';
$data = '24000441;82;100';
$key = base64_decode($secret);
$blockSize = mcrypt_get_block_size('tripledes', 'ecb');
$len = strlen($data);
$pad = $blockSize - ($len % $blockSize);
$data .= str_repeat(chr($pad), $pad);
$encrypt = base64_encode(mcrypt_encrypt('tripledes', $key, $data, 'ecb'));

PHP 版本 5.6.33,这段代码返回空有什么问题?

更新: 我有这个错误: 警告:mcrypt_encrypt():该算法不支持大小为 7 的密钥。仅支持大小为 24 的键

【问题讨论】:

  • 您查看过您的日志吗?弹出任何警告?
  • 我有警告更新我的问题
  • 你试过更长的密钥吗?

标签: php


【解决方案1】:

您的代码不返回 empty,它返回 bool(false)。根据the docs,这意味着失败。

根据维基百科,Triple DES 算法支持三个key options(强调我的):

  • 键控选项 1
    所有三个键都是独立的。有时称为 3TDEA 或三倍长密钥。
    这是最强的,有 3 × 56 = 168 个独立的密钥位。它仍然容易受到中间相遇攻击,但攻击需要 22 × 56 步。

  • 键控选项 2
    K1 和 K2 是独立的,并且 K3 = K1。有时称为 2TDEA 或双长度密钥。
    这提供了较短的 112 位密钥长度和 DES 和密钥选项 1 之间的合理折衷,具有与上述相同的警告。 [15]这是对仅需要 256 步攻击的“双 DES”的改进。 NIST 已弃用此选项。

  • 键控选项 3
    所有三个键都是相同的,即 K1 = K2 = K3。
    这与 DES 向后兼容,因为两个操作相互抵消。 ISO/IEC 18033-3 从未允许此选项,NIST 也不再允许。

    每个 DES 密钥是 8 个奇校验字节,有 56 位密钥和 8 位错误检测。 密钥包对于选项 1 需要 24 个字节,对于选项 2 需要 16 个字节,或者对于选项 3 需要 8 个字节。

错误消息要求提供 24 字节的密钥,唯一不推荐使用的选项是唯一需要 24 字节的选项。这表明 mcrypt 不支持 NIST 已弃用的密钥选项。但是没有一个选项支持 7 字节的密钥包大小,因此您首先要完成什么有点不清楚:

  • 如果您想模仿某些第三方应用程序或技术的加密方法来解密已经加密的数据,您需要收集有关所使用的确切算法和参数的更多信息。

    李>
  • 如果您只是想加密新数据以供自己使用,您可能需要尝试未放弃的库,并可能切换到没有已知漏洞的算法。 PHP 中最先进的加密库是 Sodium,自 PHP/7.2 起可用,但 OpenSSL 也是一个很好的替代方案,自 PHP/5.3 起可用

...或者只是尝试更长的密钥。

【讨论】:

    【解决方案2】:

    mcrypt_encrypt 函数的第一个参数应该是 MCRYPT_ 常量之一,所以也许这就是你的问题。 查看手册:http://php.net/manual/es/function.mcrypt-encrypt.php

    【讨论】:

    • 从您链接到One of the MCRYPT_ciphername constants, or the name of the algorithm as string.的文档中
    • 你是对的。我不记得“三元组”是现有算法之一。谢谢指正! @JonStirling
    猜你喜欢
    • 2016-11-25
    • 2016-07-22
    • 2016-11-03
    • 2017-08-28
    • 2021-12-05
    • 2015-05-10
    • 2019-04-14
    • 2016-01-07
    • 1970-01-01
    相关资源
    最近更新 更多