我一直在玩Bouncy Castle的RSA(轻量级API)实现,并找到了基础知识。查看他们spec的JCE提供程序实现,我注意到不同的填充方案可以与RSA一起使用。根据我的理解,默认情况下使用空填充。所以我开始探索OAEP填充,特别是OAEPWithSHA512AndMGF1Padding
。使用Google进行搜索并不是很有帮助,所以我开始挖掘BC的源代码并找到org.bouncycastle.jce.provider.JCERSACipher
类。但是快速查看initFromSpec
让我很头疼......具体来说,我不明白可以传递给OAEPEncoding
构造函数的最后两个参数是什么。根据BC的API,允许四个参数的OAEPEncoding
构造函数接受Digest mgf1Hash
和byte[] encodingParams
作为最后两个参数。这让我很难过,因为我不知道如何获取掩码生成算法的实例,也不了解字节数组背后的目的,称为encodingParams
。下面的代码中arg3
和arg4
的值应该是多少?
RSABlindedEngine rsa = new RSABlindedEngine();
SHA512Diges sha512 = new SHA512Digest();
Digest arg3 = ???;
byte[] arg4 = ???;
AsymmetricBlockCipher cipher = new OAEPEncoding(rsa, sha512, arg3, arg4);
答案 0 :(得分:6)
OAEP由PKCS#1, section 7.1指定。
OAEP需要以下参数:
只有一个定义的掩码生成函数,称为MGF1,该函数是在散列函数上构建的。所以你的arg3
是MGF1将使用的哈希函数。它可能与第一个哈希函数相同(我不确定它可能与Bouncy Castle API中的Digest
实例相同;我在这里以数学方式讨论)。它也可能是另一个哈希函数。
标签可以用作实例之间的一种区分(例如,您可以使用标签中编码的明确“目的”对数据进行加密)。它在一些数学证明中很方便,但是现在PKCS#1建议使用空字符串并完成它。出于PKCS#1中描述的目的,空标签与任何标签一样好。
解密过程必须知道要操作的那些参数。习惯上将它们编码在加密消息附带的结构中,并说“这是用RSA / OAEP加密的”;这就是CMS中的情况。
如有疑问,请使用与第一个参数相同的哈希函数和MGF1,并使用空标签。