【问题标题】:IV too long in PHP mcrypt_generic_initPHP mcrypt_generic_init 中的 IV 太长
【发布时间】:2014-02-19 03:31:00
【问题描述】:

我正在开展一个项目,其中所有来自 Web 服务的数据都使用三重 DES 加密进行加密。在我的具体情况下,我从已加密的 URL 接收查询字符串。 Web 服务提供商给了我两个解密值:加密 Key_192 和初始化向量 IV_192。这两个键的长度均为 24 个字符。

当我尝试解密在 PHP 中收到的查询字符串时,我使用的是 mcrypt 库。初始化通用解密方法时,我的部分功能是:

$key = "XXXXXXXXXXXXXXXXXXXXXXXX"; 
$iv = "YYYYYYYYYYYYYYYYYYYYYYYY";
$cipher = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');
mcrypt_generic_init($cipher, $key, $iv);
$result = rtrim(mdecrypt_generic($cipher, $this->hex2bin($buffer)), "\0");
mcrypt_generic_deinit($cipher);
return $result;`

但是,当我执行这部分代码时,我会收到以下消息:

mcrypt_generic_init(): Iv size incorrect; supplied length: 24, needed: 8

Web 服务提供商无法就该错误提供任何指导,而是将我引导至他们的 VB.NET 实现,其中包含如下一行:

Dim cs As CryptoStream = New CryptoStream(ms, cryptoProvider.CreateDecryptor(KEY_192, IV_192), CryptoStreamMode.Read)

它们直接传递两个密钥,类似于 mcrypt_generic_init() 函数。

我知道 IV 大小取决于密码方法(三重 DES),但我对为什么我的 IV 比函数似乎支持的更长感到困惑。怎么可能?我对这种加密的经验是有限的,我无法将查询字符串解密为任何看起来不像随机字符字段的内容。

【问题讨论】:

  • supplied length: 24, needed: 8 表示 16 太长了。

标签: php tripledes


【解决方案1】:

运行 mcrypt_enc_get_iv_size() 以计算所需的 IV 大小。对于三重 DES,它将是 8。mcrypt_generic_init() 需要一个长度完全正确的字符串,因此您应该使用较短的字符串(或者,要即时执行此操作,请使用 substr())。

【讨论】:

  • 我认为问题在于给 OP 的 IV 太长,并试图确定是代码错误还是 IV。
  • 嗯,两者兼而有之。如果字符串已经被加密,据称使用了这个 IV,那么这是不正确的,但可能是可以挽救的; OP 应该尝试使用substr($iv, 0, 8) 作为 IV。但是 code 使用 Triple DES 和 24 字符的 IV 也是不正确的。
  • 我想知道为什么当密码似乎需要一个 8 个字符的字符串时我有一个 24 个字符的字符串。我是否错误地解释了 IV 的使用?在使用之前是否需要对其进行操作或截断?这似乎违反直觉。
  • 我不知道。 24 个字符的字符串是从哪里来的?你确定你有正确的加密算法吗?如果您是,那么我的猜测是您之前的某个人保存了错误的 IV;尝试使用 substr($iv, 0, 8) 作为 IV 看看是否可行。
  • 实际上,使用子字符串产生了一个有趣的结果。我期望查询字符串解密为 cid=INTEGER&sessionid=INTEGER,并且 cid 部分实际上是可读的(cid=1234 ...)。字符串的其余部分仍然是乱码,几乎就像它已被部分解密(如果可能的话)。
【解决方案2】:

事实证明,我的解密问题是由于 mcrypt PHP 库和 VB.NET 库在加密时填充字符串的方式不同造成的。此外,关于原始问题,实际上只使用了 IV 的前 8 个字符。其他的被丢弃。更好的描述位于此处:

http://mishu666.wordpress.com/2007/08/20/problem-and-solve-of-3des-incompatibilities-with-nets-tripledescryptoserviceprovider/

【讨论】:

    猜你喜欢
    • 2016-10-15
    • 2014-06-15
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多