2012-04-17 709 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