我需要使用PHP(或Javascript)解密一些服务调用。我一整天都在努力完成这个任务,但我一直无法正确解密。PHP中的DES/ECB/PKCS5Padding解密
作为参考,该服务提供商发送我的Java以下解密示例代码:
DESKeySpec dks = new DESKeySpec("keyword".getBytes());
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
SecureRandom sr = new SecureRandom();
cipher.init(Cipher.DECRYPT_MODE, key ,sr);
byte b[] = response.toByteArray();
byte decryptedData[] = cipher.doFinal(b);
我觉得我在正确的道路使用:
$td = mcrypt_module_open(MCRYPT_DES, '', 'ecb', '');
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = substr($keyword, 0, mcrypt_enc_get_key_size($td));
mcrypt_generic_init($td, $key, $iv);
$decrypted = mdecrypt_generic($td, $data);
$decrypted = pkcs5_unpad($decrypted);
但是,坦率地说,我确定我用$ iv creationg和$ keyword设置(或者用$ data或$ decrypted类型?)搞乱了所有的东西。该pkcs5_unpad功能如下:
function pkcs5_unpad($text)
{
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text)) return false;
return substr($text, 0, -1 * $pad);
}
我不仅对PHP的一个小白,也是对密码技术......请你帮我解决这个问题呢?
+1
你的提供者是一个白痴,没有别的词。 IV(称为SR)不能随机解密。关键字不是有效的密钥。不应该使用DES,也不应该使用ECB编码。如果不指定字符编码,则不应调用getBytes。而这正是直接刺激我的东西。 –
2012-04-17 19:43:39
+0
可能是的,但是Java Sample应该可以工作(至少他是这么说的)。 “关键字”不是实际的密钥,但其余的代码应该是一个可用的java代码。 –
2012-04-17 20:56:50
+0
嗯,很小的变化,SR不用于IV,但用于密码的任何随机部分(实际上这意味着它根本没有使用)。所以Java代码可能工作。不是说IV会在ECB模式下做出任何改变,但无论如何。 –
2012-04-18 00:01:33