2011-07-16 87 views
2

我有一個Android應用程序,它使用javax.crypto來加密文件中的一些文本數據。加密實現類似於this。該應用程序可以正常使用之前創建的加密數據。Java加密API與不同平臺

現在,我幾乎將我的Android應用程序移植到桌面(JFace/SWT)。我爲移植的應用程序使用相同的加密實現,因爲它不依賴於任何Android特定的API。移植後的應用程序可以正常使用它創建的加密數據。

問題是桌面應用程序無法解密與Android應用程序一起保存的數據。 Android應用程序無法解密數據,這也與桌面應用程序一起保存。我重複檢查了明文數據和密碼的字節流,以在兩個平臺上進行加密。它們是相同的,所以文本編碼沒有問題。但是加密例程在不同平臺上返回不同的加密結果,即使輸入數據是字節到字節相同的。

Java crypto API是否保證在不同的平臺上執行相同的操作?在我的情況下,加密提供者(AES/128bit)在Android,Linux和Windows上的工作方式應該是相同的嗎?有沒有辦法調整javax.crypto以獲得不同平臺上的互操作性?

+0

加密算法是非常明確的。如果輸入字節對於字節完全相同,並且Java加密方法調用是相同的,那麼_在輸出字節中不會有差別。 –

+0

如果您顯示您用於加密/解密的代碼,我們可以顯示問題點。 –

+0

你在責怪API,但我敢打賭這是你程序中的一個錯誤。 –

回答

4

AES-128應該在兩個系統上工作相同。理論上。

在實踐中,有很多細節需要在兩個系統上保持一致。

  • 你是否在兩側使用相同的填充?
  • 你在兩邊使用相同的模式(CBC,CTR,ECB)嗎?
  • 你有究竟是雙方的密碼是否一樣?
  • 你有兩個相同的IV/Nonce嗎?
  • 雙方是否有相同的密鑰派生方法?

檢查兩個系統的默認值。如果默認值不匹配,則需要明確設置一側或另一側。

+0

謝謝你的回答。我很高興聽到有機會讓應用程序與對方的加密數據一起工作。我將嘗試查找有關所有這些CBC,CTR,ECB,填充,IV/Nonce,派生以及如何使用'javax.crypto'設置它們的信息。是的,我在雙方都使用了相同的密碼。我在兩個系統上三重檢查了密碼的字節流。 – borisstr

+0

如果可以,請避免ECB,因爲它不安全。至於密碼,請檢查雙方是否使用相同的文本編碼。例如,如果一方是UTF-8,另一方是UTF-16,那麼雖然密碼看起來相同,但它們不會相同。 – rossum

+1

重申@ rossum明智的建議的另一種方式是:不要依賴默認值。始終完全指定變換的所有方面。在編碼/解碼字符串時總是指定字符集,甚至更好的是始終使用UTF-8。永遠不要使用String作爲隨機字節的容器。 –

0

你必須向我們展示一些代碼。一個常見的初學者錯誤是將加密的數據存儲在一個字符串中,而不是存儲在其中的字節[]。字符串不是二進制數據的容器。這種技術可能會在許多方面失敗,包括默認的遊戲差異。

+0

感謝您的回答。如果您點擊問題中的鏈接,您可以查看代碼。實際的代碼非常接近鏈接上的代碼。 – borisstr

3

依賴密碼隨機數發生器在不同的平臺上產生相同的隨機數是一個錯誤。通常,密鑰衍生算法中使用的密碼隨機鹽必須從發送方傳送到接收方。它可能被作爲祕密傳達,但它確實需要傳達。當然,「主密碼」是主要的祕密。

這些鹽經常傳遞的一種方式是作爲密文的前綴。這使得密文長於明文,但我認爲你的樣本技術並不重要。另外,對於完全加密的消息交換,加密的其他參數需要傳送給解密器。你可以將它們連接到你的實現中,就像你在這裏完成的一樣,但是取決於可重複性似乎太脆弱了。這當然是攻擊者可以複製的東西,所以它不屬於你的祕密。

您可能希望重新考慮密鑰生成算法設置,使其更加健壯。事後研究:當前方法中發生的一件事是,一種加密有用的RNG正在以一種所有隨機性已被刪除的方式被使用!檢查PBKDF2和密鑰推導的建議通常是一個很好的建議。

+0

相關http://en.wikipedia.org/wiki/Key_derivation_function和http://en.wikipedia.org/wiki/PBKDF2 – CodesInChaos

+0

好點:PBKDF2很適合看這裏需要的東西。此外,W3C XML Encryption規範將提供有關需要傳送或連接到所有發送接收方的參數的線索。 – orcmid

+0

感謝您使用PBKDF2的建議。我現在看到了SHA1PRNG的問題。但是,看起來,Android目前沒有集成的PBKDF2實現。我得到了'java.security.NoSuchAlgorithmException:未找到SecureRandom PBKDF2實現' – borisstr