10

情況Java中的RSA加密:跨平臺問題?

我正在使用Java中的RSA加密。我試圖在配備Cyanogenmod的Android 2.2的HTC Saphire(32B)開發人員手機上加密數據,然後在運行Mandriva Linux 2010的64位服務器上解密所述數據。我在兩臺計算機上使用相同的公鑰,私鑰對,可以正確加密/解密Android手機上的數據,可以正確地加密/解密Linux服務器上的數據,但我無法加密手機上的數據,然後在服務器上解密。我得到了不好的填充異常。我已確認數據正在通過電話正確發送,並且正在被服務器正確解析。因此,我無法弄清楚爲什麼解密失敗。誰能幫我這個?也許Java中的RSA算法有一些關於字大小的潛在假設?

更多信息:

  • 我的加密/解密庫是基於嚮導創建here.
  • 我的加密密鑰長度爲2048位,但我看到不同的密鑰大小類似的行爲。
  • 我已將RSA加密/解密代碼打包到jar文件中。它是通過Eclipse在服務器的機器上編譯的。
  • 使用Android手機上的加密庫的程序使用上述庫。它也是使用Eclipse構建的。
  • 服務器程序是使用Netbeans構建的(因爲當時比較容易)。

其他問題

  • 是否還有其他免費的公共密鑰加密算法/可用於Java庫?他們是否跨平臺工作?人們期望他們有什麼樣的表現?等我看過這個,並沒有發現很多;也許我正在尋找與錯誤的關鍵字。

唷!我認爲就是這樣。感謝您的幫助!

+0

任何算法必須跨平臺工作,問題出在你的代碼(或配置)最有可能 – bestsss 2011-02-07 20:25:31

+0

配置,呃?什麼是可配置的RSA?我將如何在Java中執行此操作?你能提供一個指導教程的鏈接嗎?我不想花時間,但是有一位像你這樣的專家(或經驗豐富的人)可以指引我走向正確的方向,這會讓我的生活變得更加輕鬆。 – 2011-02-07 20:33:32

+0

(sry跑掉了晚餐)我的意思是配置爲公鑰/私鑰,不好的填充主要是由交換密鑰錯誤導致的。如果您確定並由於某種原因,android不支持與sun的impl相同的填充。你可以試試http://www.bouncycastle.org/ btw,你如何在同一臺設備/機器上加密/解密數據? – bestsss 2011-02-07 21:26:48

回答

12

無論環境如何,RSA加密(或任何加密算法)都應該可以工作。但是,某些系統可能會對默認填充和操作模式做出不同的假設。確保在執行加密和解密時,不僅要完整地指定算法,還要指定操作模式(CBC等)和填充。如果這不起作用,我建議從設備和服務器發佈代碼,以便我們可以更仔細地檢查它。

編輯爲了解決你的問題,在Java中,當你從加密封裝得到一個密碼,你通常用下面的代碼這樣做:

Cipher cipher; 
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

提供給getInstance的字符串指示運行時獲取將使用AES算法,密碼塊鏈操作模式和PKCS5填充的密碼實例。有一些支持的算法和填充。有關Java中加密的更多信息,請參閱this document from Oracle

更具體地講,該字符串使用請求加密的格式爲

<algorithm>/<mode of operation>/<padding> 

更糟糕的是,儘管Java的提供了大量的算法,操作模式和補白,不是所有的他們將一起工作。您將需要閱讀文檔以查找可用的配置字符串。

0

也許你應該對數據進行校驗並確保它正是你想要傳入加密/解密API的內容。