2012-06-12 61 views
6

我有一個PHP servor與CFB模式密碼/ 3DES/CFB/Java和PHP

解密3DES數據I加密在PHP中:

$montant = "500"; 
$message_crypte = mcrypt_encrypt(MCRYPT_3DES, "N4y1FRDRJ7wn7eJNnWaahCIS", $montant, ,CRYPT_MODE_CFB, "NCNPJDcR"); 
$montant = base64_encode($message_crypte); 

這個腳本在PHP與其他OK系統。

而且我想在Java加密:

public class CryptData { 
private KeySpec keySpec; 
private SecretKey key; 
private IvParameterSpec iv; 

public CryptData(String keyString, String ivString) { 
    try { 
     final MessageDigest md = MessageDigest.getInstance("md5"); 

     final byte[] digestOfPassword = md.digest(Base64 
       .decodeBase64(keyString.getBytes("ISO-8859-1"))); 

     final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); 
     for (int j = 0, k = 16; j < 8;) { 
      keyBytes[k++] = keyBytes[j++]; 
     } 

     //keySpec = new DESedeKeySpec(keyBytes); 
     keySpec = new DESedeKeySpec(keyString.getBytes()); 

     key = SecretKeyFactory.getInstance("DESede") 
       .generateSecret(keySpec); 

     iv = new IvParameterSpec(ivString.getBytes()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public String encrypt(String value) { 
    try { 
     Cipher ecipher = Cipher.getInstance("DESede/CFB/NoPadding"); 

       //"SunJCE"); 
     ecipher.init(Cipher.ENCRYPT_MODE, key, iv); 

     if (value == null) 
      return null; 

     // Encode the string into bytes using utf-8 
     byte[] valeur = value.getBytes("ISO-8859-1"); 
     //byte[] utf8 = value.getBytes(); 

     // Encrypt 
     byte[] enc = ecipher.doFinal(valeur); 

     // Encode bytes to base64 to get a string 
     return new String(Base64.encodeBase64(enc), "ISO-8859-1"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

}

我有不一樣的結果,在PHP和JAVA

如何modifiy JAVA治療得到相同的結果,PHP ?

謝謝

文斯

+0

它看起來像你的PHP不執行任何PKCS#5填充 - 是剛剛從你這裏省略樣本,還是有沒有執行填充在PHP方面? – sarnold

+0

我的PHP腳本已經與PHP或ASP或C#中的其他站點一起工作,所以我不會更改代碼,而是使用Java。 你有想法嗎? 我使用NoPadding進行了測試,但它也無法正常工作...... – user1450740

+0

這可能只是我,但對我來說,它看起來像你在PHP腳本中不是base64編碼,所以如果你在另一端對它進行解碼,會被理解爲純粹的亂碼? – 2012-06-14 09:21:17

回答

2

答案是: 密碼ecipher = Cipher.getInstance( 「DESede/CFB8/NoPadding」);

我需要使用「CFB8」

文斯