7

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

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

1 回答 1

11

OAEP 由PKCS#1 第 7.1 节指定。

OAEP 需要以下参数:

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

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

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

解密过程必须知道这些参数才能操作。通常将它们编码在与加密消息一起出现的结构中,并表示“这是用 RSA/OAEP 加密的”;这就是它在CMS中发生的方式。

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

于 2010-06-23T13:17:30.923 回答