2013-04-09 134 views
1

我需要有一個基本的/簡單的字符串加密(即低安全性不夠好,我只是想避免這種通信是人類可讀)我的Java客戶端應用程序和PHP服務器之間。Java和PHP對稱加密(DES)

我因此選擇了對稱DES加密,因爲它不需要任何密鑰交換(相同的密鑰將服務器上的客戶端和使用)+它不需要更長的密鑰Java安全策略的更新。 我也編碼/解碼Base64的數據獲取發送Http後。

不幸的是我的代碼不作爲解密的文字工作不匹配輸入。

我的Java代碼加密:

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); 
DESKeySpec keySpecEncrypt = new DESKeySpec(ParamsProvider.SERVER_ECRYPTION_SECRETKEY2); //Secret key is a byte[8] = {1, 2, 3, 4, 5, 6, 7, 8} 
SecretKey keyEncrypt = keyFactory.generateSecret(keySpecEncrypt); 

// Create the cipher 
Cipher desCipher = Cipher.getInstance("DES/CFB8/NoPadding"); 

// Initialize the cipher for encryption 
desCipher.init(Cipher.ENCRYPT_MODE, keyEncrypt); 

// Encrypt the text 
byte[] textEncrypted = desCipher.doFinal(data.getBytes("UTF-8")); 

//B64 encoding and return 
byte[] encryptedB64ByteArray = (new org.apache.commons.codec.binary.Base64()).encode(textEncrypted); 
return new String(encryptedB64ByteArray, "UTF8"); 

我的PHP代碼解密:

function decrypt($message) { 
    $secret_key = array(1, 2, 3, 4, 5, 6, 7, 8); 
    $decodedMsg = base64_decode($message); 
    return base64_decode(mcrypt_decrypt(MCRYPT_DES, $key, $decodedMsg, MCRYPT_MODE_CFB)); 
} 

我最好的猜測是,我的Java和PHP EN /解密參數是不相等的(如CFB8模式)但我不知道如何解決這個問題。

任何幫助或提示將不勝感激(我已經失去了在這一個幾個小時), 乾杯, 托馬斯

+0

我在這裏猜測,但在java端加密,然後b64。在PHP上你解密然後解密b64。我認爲,在PHP端你首先要做的decryptb64,然後解密步驟 – ITroubs 2013-04-09 12:29:12

+0

找到[這裏](http://stackoverflow.com/questions/8530312/php-equivalent-for-java-triple-des-encryption - 解密),這可能會幫助你開始。 Java在這個問題中,PHP在答案中相當於。 – Jon 2013-04-09 12:30:10

回答

3

感謝提示。

不幸的是他們都沒有爲我工作。

我終於解決了它基於這種代碼: https://github.com/stevenholder/PHP-Java-AES-Encrypt

乾杯, 托馬斯

+0

是什麼?這段代碼給了javax.crypto.BadPaddingException,你如何解決這個問題:https://github.com/stevenholder/PHP-Java-AES-Encrypt/issues/1 – 2015-11-13 17:41:41

1

您有太多選擇的填充方法,閱讀this 隨着在PHP代碼@Jon的鏈接你必須選擇PKCS#5填充:

// Create the cipher 
Cipher desCipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 
0

我在RSA的情況下有同樣的問題(java的:加密,PHP:解密), 解決了我問題如下:在keyPair生成中,將'initialize'值從512增加到1024.它起作用。 我跟着提示在這裏:http://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html 它規定,每個Java的實現必須至少實現: ... RSA/ECB/PKCS1Padding(1024,2048) ... 所以也許的結果代碼不兼容