2014-03-02 255 views
1

我想一個字符串值轉換爲密鑰DES:轉換字符串,以祕密密鑰

String sb="fffe7a50" //Example of DES key 
byte []b=sb.getBytes(); //string to bytes 
SecretKey key2 = new SecretKeySpec(b, 0, b.length, "DES"); 

但是輸出是完全地不同:

[email protected] 

我知道號碼後,「@ 「應該是DES的關鍵,但爲什麼結果不同?我該如何解決它?

回答

1

你有一些問題在這裏:

  1. sb.getBytes()做你認爲它。你期待的是一個包含{ 0xff, 0xfe, 0x7a, 0x50 }的字節數組。你得到的是一個包含{ 0x46, 0x46, 0x46, 0x45, 0x37, 0x61, 0x35, 0x30 }的字節數組(假設你使用的是UTF-8)。

    你的選擇在這裏將手動初始化字節數組,像這樣:

    byte[] b = new byte[]{ (byte) 0xff, (byte) 0xfe, (byte) 0x7a, (byte) 0x50 }; 
    

    還是要正確地解析字符串。我不確定你會怎麼做,但它應該是可行的(並且可能會有一個開源庫爲你做)。

  2. 輸出[email protected]沒有寫出密鑰的值。您所看到的是SecretKeySpectoString輸出,其格式爲<fully-qualified-class-name>@<hashcode>(有關toString()方法的詳細信息,請參閱here),因此您看到的數字​​只是SecretKeySpec對象的哈希碼,其中一定不是是非常不安全的關鍵。要查看它所持有的密鑰的值,您需要調用SecretKeySpec#getEncoded()方法。

    請注意,只調用System.out.println(byteArray)將不會顯示字節數組的內容 - 它只會再次顯示類名和哈希碼。您需要遍歷數組並逐個打印出元素,或者使用另一個工具來比較兩個數組。

相關問題