我正在开发一个项目,其中使用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长于功能似乎支持。怎么会这样?我对这种加密的经验是有限的,我无法将查询字符串解密为任何看起来不像随机字符的字段。
答案 0 :(得分:1)
运行mcrypt_enc_get_iv_size()
以确定所需的IV大小。对于Triple DES,它将为8. mcrypt_generic_init()
需要一个完全正确长度的字符串,因此您应该使用较短的字符串(或者,即时使用substr()
)。
答案 1 :(得分:0)
事实证明,我在解密时遇到的问题是由于mcrypt PHP库和VB.NET库在加密时填充字符串的方式不同而引起的。另外,关于原始问题,实际上仅使用IV的前8个字符。其他人被丢弃了。更好的描述位于: