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

And*_*rey 6 java security encryption rsa bouncycastle

我一直在玩Bouncy Castle的RSA(轻量级API)实现,并找到了基础知识.看看他们对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);
Run Code Online (Sandbox Code Playgroud)

Tho*_*nin 9

OAEP由PKCS#1,第7.1节规定.

OAEP需要以下参数:

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

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

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

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

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