在PHP mcrypt_generic_init中,IV太长了

时间:2014-02-19 03:31:00

标签: php tripledes

我正在开发一个项目,其中使用Triple DES Encryption对来自Web服务的所有数据进行加密。在我的具体情况下,我从一个已加密的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大小取决于密码方法(Triple DES),但我觉得为什么我的IV长于功能似乎支持。怎么会这样?我对这种加密的经验是有限的,我无法将查询字符串解密为任何看起来不像随机字符的字段。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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