2010-06-23 44 views
4

我一直在玩充氣城堡的RSA(輕量級API)的實現,並得到了基本的想法。查看他們的spec JCE提供程序實現,我注意到不同的填充方案可以用於RSA。據我所知,默認情況下使用null填充。所以我開始探索OAEP填充,特別是OAEPWithSHA512AndMGF1Padding。用Google搜索並不是非常有用,所以我開始挖掘BC的源代碼,發現org.bouncycastle.jce.provider.JCERSACipher類。但看着initFromSpec很快就讓我頭疼......具體來說,我不明白可以傳遞給OAEPEncoding構造函數的最後兩個參數是什麼。根據BC的API OAEPEncoding構造函數,它允許四個參數接受Digest mgf1Hashbyte[] encodingParams作爲最後兩個參數。這難倒了我,因爲我不知道如何獲得掩碼生成算法的實例,也不瞭解字節數組背後的用途,即encodingParams。在下面的代碼中應該是arg3arg4的值?如何正確使用Bouncy Castle的RSA(輕量級API)的OAEPEncoding

RSABlindedEngine rsa = new RSABlindedEngine(); 
SHA512Diges sha512 = new SHA512Digest(); 
Digest arg3 = ???; 
byte[] arg4 = ???; 
AsymmetricBlockCipher cipher = new OAEPEncoding(rsa, sha512, arg3, arg4); 

回答

6

OAEP由PKCS#1, section 7.1指定。

OAEP需要以下參數:

  • 的哈希函數;
  • 一個「掩模生成函數」,可以被認爲是具有無限輸出長度的散列函數;
  • 「標籤」(任意字節序列)。

只有一個定義的掩碼生成函數,稱爲MGF1,並且該函數是在散列函數上構建的。所以你的arg3是MGF1將使用的散列函數。它可能與第一個哈希函數相同(我不確定它可能與Bouncy Castle API中的實例相同;我在這裏以數學方式進行討論)。它也可能是另一個散列函數。

該標籤可以用作實例之間的一種區別(例如,您可以使用標籤中編碼的顯式「目的」來加密數據)。它在一些數學證明中很方便,但是現在PKCS#1建議使用一個空字符串並且完成它。出於PKCS#1中描述的目的,空標籤與任何標籤一樣好。

解密過程必須知道這些參數才能操作。習慣上將它們編碼在與加密的消息一起出現的結構中,並且表示「這是用RSA/OAEP加密的」;這是CMS發生的情況。

如果有疑問,請使用與第一個參數相同的散列函數,並使用MGF1,並使用空標籤。

+0

謝謝。像往常一樣清晰簡潔。快速跟進問題,你知道是否重用Digest對象的同一個實例是個好主意嗎?現在我有三個獨立的實例:兩個傳入OAEPEncoding編碼構造函數,另一個傳遞給RSADigestSigner(用於簽名)。 – Andrey 2010-06-23 13:33:53

+0

@ yamsha:它取決於Bouncy Castle的實現。他們以自然順序的順序來做事情是合理的,在這種情況下,重複使用相同的摘要將會正常工作。創建新的摘要實例的成本可以忽略不計,這同樣合理。爲了安全起見,我會推薦使用不同的實例。但是很可能兩種方式的影響都很小。 – 2010-06-23 15:23:50

相關問題