2010-07-03 40 views
0

我終於 - 經過數天和數天的痛苦 - 發現我需要兩種形式的數字簽名項目加密。第一意願將對稱(AES)和將加密的許可證數據和第二將是一個不對稱的(RSA)的意願加密對稱密鑰。有人可以給我指示Android上最好的方法。數字簽名的推薦加密組合

For the public/private keys I am using: "RSA/ECB/PKCS1Padding"(我ECB頭是壞的,所以我應該用什麼?關於PKCS1Padding什麼? - shoudl我使用PKCS5Padding)

For the symetric keys I will probably use: "AES/???/?????????"(我應該用什麼模式和填充?)

提供者: 「BC」

RSA密鑰大小:1024(我試過2048,但它並沒有出於某種原因)

AES密鑰大小:???? (建議)

此外,如果你知道我在哪裏可以找到一個很好的指導,什麼是實際支持Android會很好。

我絕不是加密專家,所以如果在這裏看起來有點不穩定,請告訴我一個更好的選擇!

如果你知道一個很好的結合,但如果它支持在Android不知道請告訴我,讓我不要最終浪費一大堆時間去尋找它不支持。

回答

2

ECB是不安全的塊加密模式,因爲它太容易了64,128,或256個塊在輸入流中重用 - 重複內容的存在將立即在密文中可見。

但RSA不用於加密輸入「流」 - 它永遠只能用於加密會話密鑰(如你似乎做)或簽署消息的輸出消化功能。所以RSA的ECB模式很好。

在RSA中使用PKCS#1填充方案; PKCS#5填充方案用於對稱密碼。

如果1024是密鑰對,你可以用最大的RSA(或產生的設備上?),那麼可能128或192位AES是類似的風險。取決於256位AES的速度有多慢,我可能會用它來代替,只是爲了提供另外的四年或五年緩衝區來防止AES攻擊中的算法改進。

NIST對使用AES指南推薦使用任何的:CBC,CFB,OFB,CTR或模式。

同樣的指導方針還提到'add 1和少數0位是完成最終塊的填充機制所需的,所以它應該足夠安全以便使用。

但對於這一切,我一直在使用GPGME或OpenSSL的或GNUTLS做所有的工作建議。試圖使自己的協議可以非常微妙。希望Android上有一些更高級別的工具包可以讓簽名生成/驗證更容易。

NIST的指導方針:http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf

2

說到AES的操作模式,你可以去CBC。如果您的RSA模數爲1024位,則不需要大於128位的AES密鑰。如果有許可證和軟件保護的事,人們會繞過代碼,不會打破加密:)

0

如果你正在做的簽名比你應該使用Signature類。

+0

我確實需要來獲取信息了客戶端上的加密文件,所以我沒有這個簽名類允許這本。 – jax 2010-07-03 16:00:46

+0

你說你在做數字簽名。如果是這樣,你不加密任何東西。你爲什麼要加密文件? – 2010-07-03 16:25:30

+0

我被告知它被稱爲另一個線程上的數字簽名,我之前稱它爲許可證。基本上我在裏面存儲一些信息,例如設備ID,用戶名等。我需要能夠檢索這些信息,以便在設備上向用戶顯示,並檢查設備ID是否等於其許可設備ID。 – jax 2010-07-04 05:01:42

0

你不應該重新發明車輪。使用BouncyCastle支持的標準機制。

簽字,你應該使用PKCS#7簽名,這是由這個類處理,

http://bouncycastle.gva.es/www.bouncycastle.org/docs/mdocs1.4/org/bouncycastle/cms/CMSSignedDataGenerator.html

對於加密,您可以使用S/MIME的API,它可以處理對稱密鑰生成/加密/包圍你,

http://www.bouncycastle.org/wiki/display/JA1/CMS+and+SMIME+APIs

+0

這看起來很有趣,但您提供的這些鏈接並沒有那麼有用。這兩個API對我來說可以做些什麼,特別是SMIME API? – jax 2010-07-04 05:12:34

+0

也許這個例子會更好地解釋它? http://www.java2s.com/Open-Source/Java-Document/Security/Bouncy-Castle/org/bouncycastle/mail/smime/examples/CreateEncryptedMail.java.htm – 2010-07-04 13:50:12