2011-05-19 86 views
5

我有一個字符串做DES加密的.NET方法:Java與.NET中的DES加密 - 爲什麼不同?

public static string EncryptTripleDES(string value, byte[] encryptionKey, byte[] initializationVector) { 
    if (!value.IsNullOrEmpty()) { 
    TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider(); 
    MemoryStream ms = new MemoryStream(); 
    CryptoStream cs = new CryptoStream(ms, cryptoProvider.CreateEncryptor(encryptionKey, initializationVector), CryptoStreamMode.Write); 
    StreamWriter sw = new StreamWriter(cs); 
    sw.Write(value); 
    sw.Flush(); 
    cs.FlushFinalBlock(); 
    ms.Flush(); 
    //convert back to a string 
    return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); 
    } else { 
    return ""; 
    } 
} 

正如你看到的,算法需要兩個參數 - 一個「加密密鑰」和「初始化向量」。

現在我需要在Java中編寫一個DES加密/解密函數,並行執行此功能,這樣,如果您提供相同的加密密鑰和初始化向量,則可以在Java中解密使用C# 。 (提供Java工作服,自上次使用Java之後約10年的灰塵,Java中用於DES加密的Googles ...)

找到了體面的Java DES加密方法here。但是 - 哦,親愛的,事實證明,這個算法堅持一個正好8個字節的初始化向量; .NET代碼使用24個字節的init向量!

現在呢?爲什麼Java堅持一個8字節的初始化向量?我該如何解密使用24字節初始化向量加密的內容?

+0

如果你正在加密這個數據,因爲你需要安全性,並且你需要使用DES的一個版本,我會使用168位的TripleDES,而不是56位的標準DES。如果您的數據因任何原因需要安全,標準DES很容易被破解。 – FreeAsInBeer 2011-05-19 15:46:54

回答

2

您是否嘗試過在Java代碼中使用24字節初始化向量的前8個字節?通過搜索和查看源代碼所看到的所有內容都表明,由於Triple DES具有8字節的塊大小,因此只能使用前8個字節。我真的很驚訝,因爲IV與算法的塊大小不匹配,所以.NET代碼不會引發像this question中提到的異常。另請參見this question,其中成功使用8字節IV的示例。

.NET代碼中的另一個挑戰是默認值用於填充和密碼模式。我不知道是什麼。NET將用於那些,雖然備註here表明默認密碼模式是CBC。我看不到填充,但從互操作性示例here看來,CBC和PKCS5Padding似乎可以工作。儘管如此,我仍然猶豫依靠默認設置來實現互操作性,因爲它們可能存在問題。

來自Java背景我不太確定使用24字節IV的C#代碼是怎麼回事,但是由Java執行的8字節IV似乎對我來說是正確的。我總是有興趣證明自己錯了,並且學習新東西。 @Tim提到的Bouncycastle也強制執行這個相同的約束,看起來像.NET通常也是這樣。

+0

你是天才,你!我將字節數組截斷爲8個字節,並且它完美地工作!謝謝! – 2011-05-19 15:05:18

2

From MSDN

的IV特性被自動設置到 每當你 創建 SymmetricAlgorithm類之一或當你 手動調用GenerateIV方法的新實例的新的隨機值。 IV屬性的大小必須爲 與BlockSize屬性相同。

所以在我看來,你可以簡單地改變BlockSize屬性,然後你可以將IV設置爲你需要的任何大小。

編輯

從我所聚集在我的研究,似乎是(讓你有56個字節64位,其中8項獲得扔掉,)DES加密算法使用8個字節的所有實現。 TripleDES(3DES)允許24個字節的密鑰(或192位,其中24位被丟棄,留下168位)。

看來,你要麼需要在Java中使用的TripleDES算法(幾個庫可用,exampleSO Question),或者你需要使用.NET中的常規DES加密算法重新加密數據。

+0

嗯...這對.NET很好...我正在尋找Java解決方案... – 2011-05-19 11:59:57

+0

@Shaul - 我認爲他的觀點是,您可以將.NET實現更改爲使用8字節的IV,然後Java方法將會有它想要的。 – Tim 2011-05-19 12:02:51

+0

@Tim - .NET就是它;我無法改變這一點,此外,我們已經擁有了我們現在需要能夠用Java解密的加密數據。 – 2011-05-19 12:03:59

0

你看了一下用於Java的Bouncy Castle庫嗎?我無法從他們的(非常稀少的)文檔和樣本中看出來,但它似乎是一個廣泛使用的庫,所以我希望它能夠靈活。值得一看,至少如果你還沒有。