我正在开发一个项目,其中来自 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 比函数似乎支持的更长感到困惑。怎么可能?我对这种加密的经验是有限的,我无法将查询字符串解密为任何看起来不像随机字符字段的东西。