0

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

4

2 回答 2

1

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

于 2014-02-19T03:35:27.987 回答
0

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

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

于 2014-02-20T14:10:56.410 回答