php中的3des - 无法获得好的密钥/字符串

时间:2012-12-28 17:44:14

标签: php cryptography encryption 3des tripledes

我需要在php中解码3des字符串,而且到目前为止我还没有使用dedespting的经验......

第一步是:获取密钥和要解码的字符串集 - 我已经有了。

我有关于algorythm的信息:

类型: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);
} 

在beginnig中,您会看到示例数据,并且此数据代码正常工作。当我尝试使用自己从SOAP webservice从数据库获取的数据时,问题就出现了。我看到了这个错误:

警告:pack()[function.pack]:输入H:....中的非法十六进制数字

enter image description here

尽管在剧本中尝试了不同类型的编码,但我得到了这个。脚本文件本身在ANCI中。

另外:正如你在评论中看到的那样,我也已经用IV进行了一些实验,但如果没有处理我猜到的第一个问题就没有意义。

另一件事是填充== PKCS5。我是否需要使用它,我应该如何处理?

我真的很感激这方面的帮助。

1 个答案:

答案 0 :(得分:0)

好的,我找到了一个主要基于这篇文章的解决方案:PHP Equivalent for Java Triple DES encryption/decryption - thanx guys和+1。

$iv = array('0','0','0','0','0','0','0','0');
echo @decryptText($temp->patient->firstName, $deszyfrator->return->rawDESKey, $iv);
echo @decryptText($temp->patient->surname, $deszyfrator->return->rawDESKey, $iv);

function decryptText($encryptText, $key, $iv) {

    $cipherText = base64_decode($encryptText);
    $res = mcrypt_decrypt("tripledes", $key, $cipherText, "cbc", $iv);

    $resUnpadded = pkcs5_unpad($res);    
    return $resUnpadded;
}

function pkcs5_unpad($text)
{
    $pad = ord($text{strlen($text)-1});
    if ($pad > strlen($text)) return false;
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
    return substr($text, 0, -1 * $pad);
}

然而我收到警告(现在隐藏@)。 “我应该和块大小具有相同的长度” - 我尝试了所有可以解决的组合,我无法摆脱它。有人在想吗?

编辑:修复了次要问题。这个kode将修复iv:

$iv_size=mcrypt_get_iv_size("tripledes","cbc");
$iv = str_repeat("\0", $iv_size);   //iv size for 3des is 8