Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何正确使用Bouncy Castle';RSA的OAEPEncoding(轻量级API)_Java_Security_Encryption_Rsa_Bouncycastle - Fatal编程技术网

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

Java 如何正确使用Bouncy Castle';RSA的OAEPEncoding(轻量级API),java,security,encryption,rsa,bouncycastle,Java,Security,Encryption,Rsa,Bouncycastle,我一直在研究Bouncy Castle的RSA(轻量级API)实现,并找到了基本的解决方法。查看他们的for JCE提供程序实现,我注意到RSA可以使用不同的填充方案。据我所知,默认情况下使用空填充。所以我开始探索OAEP填充,特别是OAEP与HA512和MGF1padding。用谷歌搜索并没有什么帮助,所以我开始挖掘BC的源代码并找到了这个类。但是看着initFromSpec很快让我头疼。。。具体地说,我不明白可以传递给OAEPEncoding构造函数的最后两个参数是什么。根据BC的API,允

我一直在研究Bouncy Castle的RSA(轻量级API)实现,并找到了基本的解决方法。查看他们的for JCE提供程序实现,我注意到RSA可以使用不同的填充方案。据我所知,默认情况下使用空填充。所以我开始探索OAEP填充,特别是
OAEP与HA512和MGF1padding
。用谷歌搜索并没有什么帮助,所以我开始挖掘BC的源代码并找到了这个类。但是看着
initFromSpec
很快让我头疼。。。具体地说,我不明白可以传递给
OAEPEncoding
构造函数的最后两个参数是什么。根据BC的API,允许四个参数的构造函数接受
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);
OAEP由指定

OAEP需要以下参数:

  • 散列函数
  • 一个“掩码生成函数”,可以被认为是具有无限输出长度的散列函数
  • “标签”(任意字节序列)
只有一个定义的掩码生成函数,称为MGF1,该函数是在哈希函数上构建的。因此,您的
arg3
是MGF1将使用的哈希函数。它可能与第一个哈希函数相同(我不确定它是否与Bouncy Castle API中的
摘要
实例相同;我在这里讲的是数学)。它也可能是另一个哈希函数

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

解密过程必须知道这些参数才能运行。习惯上,将其编码为加密消息附带的结构,并表示“这是使用RSA/OAEP加密的”;这就是它在中国发生的方式


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

谢谢。像往常一样清晰简洁。快速跟进问题,您知道重用摘要对象的同一实例是否是一个好主意吗?现在我有三个独立的实例:两个传递到OAEPEncoding构造函数,一个传递到RSADgestSigner(用于签名)。@yamsha:这取决于Bouncy Castle实现。他们按照自然、有序的顺序做事似乎是合理的,在这种情况下,重用同一个摘要将正常工作。同样合理的是,创建新摘要实例的成本可以忽略不计。为了安全起见,我建议使用不同的实例。但无论哪种方式,它的影响都很小。