我需要在 php 中解码一个 3des 字符串,到目前为止我还没有解码经验......
第一步是:获取要解码的密钥和字符串集——我已经有了。
我有关于算法的信息:
类型:CBC,填充 - PKCS5,初始化向量(iv?) - 八个零的数组
我尝试这种方式:
// very simple ASCII key and IV
$key = "passwordDR0wSS@P6660juht";
$iv = "password";
//$iv = array('0','0','0','0','0','0','0','0');
//$iv = "00000000";
$cipher = mcrypt_module_open(MCRYPT_3DES, '', 'cbc', '');
//$iv = mcrypt_enc_get_iv_size($cipher);
// DECRYPTING
echo "<b>String to decrypt:</b><br />51196a80db5c51b8523220383de600fd116a947e00500d6b9101ed820d29f198c705000791c07ecc1e090213c688a4c7a421eae9c534b5eff91794ee079b15ecb862a22581c246e15333179302a7664d4be2e2384dc49dace30eba36546793be<br /><br />";
echo "<b>Decrypted 3des string:</b><br /> ".SimpleTripleDesDecrypt('51196a80db5c51b8523220383de600fd116a947e00500d6b9101ed820d29f198c705000791c07ecc1e090213c688a4c7a421eae9c534b5eff91794ee079b15ecb862a22581c246e15333179302a7664d4be2e2384dc49dace30eba36546793be')."<br />";
function SimpleTripleDesDecrypt($buffer) {
global $key, $iv, $cipher;
mcrypt_generic_init($cipher, $key, $iv);
$result = rtrim(mdecrypt_generic($cipher, hex2bin($buffer)), "\0");
mcrypt_generic_deinit($cipher);
return $result;
}
function hex2bin($data)
{
$len = strlen($data);
return pack("H" . $len, $data);
}
在开始时,您会看到示例数据,并且在此数据上代码工作正常。当我尝试使用通过 SOAP Web 服务从数据库获取的自己的数据时,问题就开始了。我看到这个错误:
警告:pack() [function.pack]:H 型:非法十六进制数字在....
尽管尝试在脚本中使用不同类型的编码,但我还是得到了这个。脚本文件本身在 ANCI 中。
另外:正如您在评论中看到的那样,我也对 IV 进行了一些实验,但如果不处理我猜的第一个问题,它就没有意义。
另一件事是填充== PKCS5。我是否需要使用它,我应该如何使用它?
我真的很感激这方面的帮助。