2012-11-01 38 views
0

我有一個問題,我一直試圖解決過去三天。我必須使用DES來加密字節數組以獲得特定結果。但是,Java中的DES的默認實現(Javax.crypto.cipher,JDK 7,提供者SunJCE版本1.7)似乎不起作用。 當我有以下代碼:Java密碼DES怪異結果

 

    private void testDES() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { 
     Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); 
     byte[] keyByte = convertStringToBytes("00 00 00 00 00 00 00 00"); 
     byte[] data = convertStringToBytes("00 00 00 00 00 00 00 00"); 
     Key key = new SecretKeySpec(keyByte, "DES"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     System.out.println(hexadecimalString(cipher.doFinal(data))); 
    } 
 

它打印F4 DA 4D 97 BF CF 23 D9而不是正確結果的圖8C A6 4D E9 C1 B1 23 A7(根據測試向量:http://common-lisp.net/project/clbuild/mirror/ironclad/test-vectors/des.testvec) 的方法hexadecimalString和convertStringToBytes只是將字節轉換爲hexa,反之亦然。 任何人都可以幫我嗎?經過了相當長的時間,我只是不知道該怎麼做。提前致謝。喬

+0

也許這些方法只是做了錯誤的?爲什麼不直接使用字節:'new byte [] {0,0,0,0,0,0,0,0}'? –

回答

1

我認爲問題是與convertStringToBytes或十六進制字符串。

您可以更換:

byte[] keyByte = convertStringToBytes("00 00 00 00 00 00 00 00"); 
byte[] data = convertStringToBytes("00 00 00 00 00 00 00 00"); 

有:

byte[] keyByte = new byte[8]; 
byte[] data = new byte[8]; 

...因爲在Java中,數組初始化爲零。

當我運行相同的代碼,但與上述(而不是convertStringToBytes),然後我得到預期的結果(8C A6 ...)

編輯: 既然你仍然有問題,這是一個完整的程序。對我來說,輸出:

8c a6 4d e9 c1 b1 23 a7 

代碼如下:

public class Main { 
    public static void main(String[] args) throws GeneralSecurityException { 
     Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); 
     byte[] keyByte = new byte[8]; 
     byte[] data = new byte[8]; 
     Key key = new SecretKeySpec(keyByte, "DES"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     byte[] result = cipher.doFinal(data); 
     StringBuilder str = new StringBuilder(); 
     for (byte b : result) { 
      str.append(Integer.toHexString(0xff & b)).append(' '); 
     } 
     System.out.println(str); 
    } 
} 
+0

嗨,感謝您的回覆,但不幸的是,它不起作用 - 即使用net byte [8]替換上述變量後,它仍然返回相同的結果:( 這可能意味着我的系統中存在某種錯誤? – Falkenstein

+0

也許你的'hexadecimalString()'方法也是錯誤的。 –

+0

這樣做!非常感謝,回答標記爲正確:) – Falkenstein