如何正确使用Bouncy Castle的OAEPEncoding for RSA(轻量级API)

时间:2010-06-23 12:00:51

标签: java security encryption rsa bouncycastle

我一直在玩Bouncy Castle的RSA(轻量级API)实现,并找到了基础知识。查看他们spec的JCE提供程序实现,我注意到不同的填充方案可以与RSA一起使用。根据我的理解,默认情况下使用空填充。所以我开始探索OAEP填充,特别是OAEPWithSHA512AndMGF1Padding。使用Google进行搜索并不是很有帮助,所以我开始挖掘BC的源代码并找到org.bouncycastle.jce.provider.JCERSACipher类。但是快速查看initFromSpec让我很头疼......具体来说,我不明白可以传递给OAEPEncoding构造函数的最后两个参数是什么。根据BC的API,允许四个参数的OAEPEncoding构造函数接受Digest mgf1Hashbyte[] encodingParams作为最后两个参数。这让我很难过,因为我不知道如何获取掩码生成算法的实例,也不了解字节数组背后的目的,称为encodingParams。下面的代码中arg3arg4的值应该是多少?

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

1 个答案:

答案 0 :(得分:6)

OAEP由PKCS#1, section 7.1指定。

OAEP需要以下参数:

  • 哈希函数;
  • “掩码生成函数”,可以被认为是具有无限输出长度的散列函数;
  • “标签”(任意字节序列)。

只有一个定义的掩码生成函数,称为MGF1,该函数是在散列函数上构建的。所以你的arg3是MGF1将使用的哈希函数。它可能与第一个哈希函数相同(我不确定它可能与Bouncy Castle API中的Digest实例相同;我在这里以数学方式讨论)。它也可能是另一个哈希函数。

标签可以用作实例之间的一种区分(例如,您可以使用标签中编码的明确“目的”对数据进行加密)。它在一些数学证明中很方便,但是现在PKCS#1建议使用空字符串并完成它。出于PKCS#1中描述的目的,空标签与任何标签一样好。

解密过程必须知道要操作的那些参数。习惯上将它们编码在加密消息附带的结构中,并说“这是用RSA / OAEP加密的”;这就是CMS中的情况。

如有疑问,请使用与第一个参数相同的哈希函数和MGF1,并使用空标签。