2012-04-17 708 views
3

我需要使用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代码。 – deCorvett 2012-04-17 20:56:50

+0

嗯,很小的变化,SR不用于IV,但用于密码的任何随机部分(实际上这意味着它根本没有使用)。所以Java代码可能工作。不是说IV会在ECB模式下做出任何改变,但无论如何。 – 2012-04-18 00:01:33

回答

0

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

+0

实际关键字长度为11个字符。我已经尝试过所有零的建议,没有运气。我在服务响应中收到了很多符号,所以我认为我可能需要在解密之前进行一些转换。 – deCorvett 2012-04-18 08:22:38

+0

也取决于你作为结果期待什么?你没有告诉我们,所以我们不能说。这就是为什么我建议写一个ecrypt方法......哦,创建DES密钥afaik时不接受11个字节。 – 2012-04-18 12:34:15