我试图在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
并且3132333431323334
为12341234
十六进制。
答案 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网站中生成确切结果。
感谢@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])));