2017-07-28 78 views
0

我試圖在C#中模擬Java的相同行爲。但我沒有得到期望的結果。由兩者產生的密鑰是不同的。在.net下模擬PBEWITHMD5ANDDES加密來自JAVA

Java代碼

 public static String generateDecryptedKey(String secretKey, String authKey) 
    { 
     String strDecryptedKey = ""; 
     byte[] salt = { (byte)0x09, (byte)0xD5, (byte)0xA1, (byte)0xA6, (byte)0xA3, (byte)0xA7, (byte)0xA9, (byte)0xA0 }; 
     int iterationCount = 10; 
     KeySpec keySpec = new PBEKeySpec(secretKey.toCharArray(), salt, iterationCount); 
     SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec); 
     AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount); 
     dcipher = Cipher.getInstance(key.getAlgorithm()); 
     dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec); 
     byte[] enc = Base64.decodeBase64(authKey.getBytes()); 
     byte[] utf8 = dcipher.doFinal(enc); 
     strDecryptedKey = new String(utf8, "UTF-8"); 
     return strDecryptedKey; 
    } 

C#代碼通過在相同的輸入兩者功能生成

 public static string generateDecryptedKey(string secretKey,string authKey) 
    { 
     string strDecryptedKey = string.Empty; 
     byte[] salt = { (byte)0x09, (byte)0xD5, (byte)0xA1, (byte)0xA6, (byte)0xA3, (byte)0xA7, (byte)0xA9, (byte)0xA0 }; 
     int iterationCount = 10; 
     PKCSKeyGenerator kp = new PKCSKeyGenerator(); 
     ICryptoTransform crypt = kp.Generate(secretKey, salt, iterationCount, 1); 
     var bytes = Encoding.UTF8.GetBytes(authKey);  
     byte[] resultBytes = crypt.TransformFinalBlock(bytes, 0, bytes.Length); 
     strDecryptedKey = Convert.ToBase64String(resultBytes); 
     return strDecryptedKey; 
    } 

結果即將錯誤。我是密碼學新手,請有人解釋我做錯了什麼。下面是BobJanova編寫的用於C#轉換的類的鏈接。

https://www.codeproject.com/Articles/16450/Emulating-PBEWithMD-AndDES-Encryption-under-NET

注:我不想透露我的鹽值,所以我改變了一些價值。希望你能理解。

回答

0

您應該使用

var bytes = Convert.FromBase64String(authKey); 

,而不是

var bytes = Encoding.UTF8.GetBytes(authKey); 

strDecryptedKey = Encoding.UTF8.GetString(resultBytes); 

,而不是

strDecryptedKey = Convert.ToBase64String(resultBytes); 
在C#中使用

另外,Java中的authKey.getBytes()可能會導致問題。始終指定編碼,如authKey.getBytes("UTF-8")

+0

謝謝@ artjom-b的回覆。很高興有人至少嘗試過。我正要失去對stackoverflow的信心。我試圖按照你的建議做同樣的事情,但輸出會有所不同。 ** JAVA:** 6a48467d40035c6056b39eb06c90938941a1a23f。 **。NET:** {q 7 t X (f J) P3* o 7ǥd߱߱ 7 – CHUHA

+0

對不起,沒有一些示例輸入,我無法進一步幫助您。 –