PHP中的DES / ECB / PKCS5Padding解密

时间:2012-04-17 18:51:35

标签: php encryption des

我需要使用PHP(或Javascript)解密一些服务调用。我花了一整天努力完成,但是我一直无法正确解密。

作为参考,服务提供商向我发送了以下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 个答案:

答案 0 :(得分:0)

确保您的密钥由相同的字节组成(字符串可能以不同的方式编码)并将其填充为填充零的IV。 ECB模式不使用IV(并且PHP手册指定了多少),但是如果你给它一个默认值为全零 - IV将与第一个纯文本块进行异或,所以将其设置为全零将取消该操作。此外,请确保输入密码数据相同。忽略第一个实例中的填充,您应该能够在取消填充之前检查结果是否正确。