我需要使用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的一個小白,也是對密碼技術......請你幫我解決這個問題呢?
你的提供者是一個白癡,沒有別的詞。 IV(稱爲SR)不能隨機解密。關鍵字不是有效的密鑰。不應該使用DES,也不應該使用ECB編碼。如果不指定字符編碼,則不應調用getBytes。而這正是直接刺激我的東西。 – 2012-04-17 19:43:39
可能是的,但是Java Sample應該可以工作(至少他是這麼說的)。 「關鍵字」不是實際的密鑰,但其餘的代碼應該是一個可用的java代碼。 – deCorvett 2012-04-17 20:56:50
嗯,很小的變化,SR不用於IV,但用於密碼的任何隨機部分(實際上這意味着它根本沒有使用)。所以Java代碼可能工作。不是說IV會在ECB模式下做出任何改變,但無論如何。 – 2012-04-18 00:01:33