2011-10-12 192 views
0

我試圖從C#轉換爲Java的以下代碼,但我得到不同的結果值的鍵。這裏是我的代碼:C#加密代碼移植到Java

C#:

 plainText = "Hello World"; 
     passPhrase = "IhDyHz6bgQyS0Ff1/1s="; 
     saltValue = "0A0Qvv09OXd3GsYHVrA="; 
     hashAlgorithm = "SHA1"; 
     passwordIterations = 3; 
     initVector = "GjrlRZ6INgNckBqv"; 
     keySize = 256; 

     byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector); 
     byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue); 

     byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); 

     PasswordDeriveBytes password = new PasswordDeriveBytes(
                 passPhrase, 
                 saltValueBytes, 
                 hashAlgorithm, 
                 passwordIterations); 

     byte[] keyBytes = password.GetBytes(keySize/8); 

的Java

 byte[] password = PassPhrase.getBytes("ASCII"); 
     byte[] salt = PKCS5S1ParametersGenerator.PKCS5PasswordToBytes(SaltValue.toCharArray()); 

     PKCS5S1ParametersGenerator generator = new PasswordDeriveBytes(new SHA1Digest()); 
     generator.init(password, salt, PasswordIterations); 

     byte[] key = ((KeyParameter)generator.generateDerivedParameters(32)).getKey(); 

的問題是,我得到不同的密鑰,即使提供了兩個代碼相同的參數:(只前4個字節匹配)

注意:此值已被轉化爲Base64:

C#: GWR/loJAuuiPvP0cuGGCVXErz16HjOZ7yQkCCHfBux4 = 爪哇: GWR/4oCT

如果我保持與提供給generateDerivedParameters(32)的數量播放時,它只給了我更多的字節,但仍然不符合.Net的結果。

我不能更改.Net代碼,所以請任何建議必須在Java端完成。

在此先感謝。

回答

1

generateDerivedParameters方法說:「keySize我們想要的密鑰的大小(以位爲單位)」。所以,你必須使用generateDerivedParameters(32 * 8)

+0

感謝澄清,但仍然不匹配的C#鍵,這就是結果:GWR/4oCT4oCaQMK6w6jvv73CvMO9HMK4YeKAmlVxK8OPXuKAocWSw6Z7w4kJAgh3w4HCux4 = – lidermin

+0

貌似不同的標準(原文如此)的Base64是使用不同的字母。你可以比較字節,二進制值來驗證它是否相同? – kan

+0

OMG你是完全正確的,儘管我已經在C#中測試了很多Base64 Java方法轉換,這次我一直愚蠢,看着字節,它們實際上是相同的。 – lidermin