DES加密字符串并转换为十六进制

时间:2014-01-29 21:51:39

标签: php encryption hex des

我试图在PHP中找到一种可以使用DES算法加密十六进制字符串的方法。我需要的结果应该与this page完全相同。

我尝试的所有PHP代码都给出了与我在该页面中获得的结果不同的结果。 我试过这段代码:

<?php
function Encrypt($data, $key)
{    
  $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb');
  return $encData;
}
echo strtoupper(bin2hex(Encrypt("12341234", "1100000120140129")));
?>

结果是:0D54E1C0B08DCB90。在this link中,结果为:4DC7D8B78F0F33A3

请注意,31313030303030313230313430313239为十六进制1100000120140129 并且313233343132333412341234十六进制。

2 个答案:

答案 0 :(得分:1)

这段代码对我有用:

$keyA = "11000001";
$keyB = "20140129";
$data = "12341234";
$TMP = mcrypt_encrypt('tripledes', $keyA, $data, 'ecb');
$TMP = mcrypt_decrypt('tripledes', $keyB, $TMP, 'ecb');
echo strtoupper(bin2hex(mcrypt_encrypt('tripledes', $keyA, $TMP, 'ecb')));

我使用双键三重DES方法在此DES calculator网站中生成确切结果。

  1. 使用密钥的前半部分(最左边的8位数字)加密数据
  2. 使用密钥的后半部分(最右边的8位数字)解密密文
  3. 再次使用密钥的前半部分重新加密密文
  4. 感谢@Duncan的有用帮助。

答案 1 :(得分:0)

这个问题似乎是由PHP在将字符串和数据提供为字符串时读取密钥和数据的方式引起的。使用以下代码解决此问题:

$key = pack('H*', "0123456789abcdef"); // this correctly maps hex to bytes
$data = pack('H*', "0123456789abcdef");
echo bin2hex(mcrypt_encrypt(MCRYPT_DES, $key, $data, MCRYPT_MODE_ECB));

这输出56cc09e7cfdc4cef与DES计算器(proof)匹配。


对于那些感兴趣的人,我还使用以下Java代码来推断正在发生的事情。这打印出与PHP相同的结果:

SecretKey key = new SecretKeySpec(new byte[8], "DES");

Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key);

System.out.println(DatatypeConverter.printHexBinary(cipher
    .doFinal(new byte[8])));