当前位置: 首页 > 面试题库 >

使用SHA-256和MGF1Padding分解RSA / ECB / OAEP

海嘉赐
2023-03-14
问题内容

Java有一种称为的模式RSA/ECB/OAEPWithSHA-256AndMGF1Padding。那有什么意思?

RFC3447,公开密钥密码标准(PKCS)#1:RSA密码规范2.1版,第7.1.2节解密操作说,哈希和MGF都是RSAES-OAEP-DECRYPT的选项。MGF是它自己的功能,在B.2.1节MGF1中定义,并且还具有自己的Hash“选项”。

也许RSAES-OAEP-DECRYPT和MGF1中的哈希“选项”应该是相同的,或者它们可能不相同,但我不清楚。如果它们是,那么我想您什么时候拥有RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING,这意味着应同时使用sha256。但是,如果不希望它们相同,则可以将sha256用于RSAES-OAEP-DECRYPT,例如,将sha1用于MGF1。如果是这种情况,那么sha256应该用于什么功能?以及应该将哪种哈希算法用于其他功能?

在这种情况下,欧洲央行是什么意思?ECB是对称块密码模式。电子密码书。也许应该说这意味着Java如何处理比模数更大的纯文本?就像将纯文本拆分成与模一样大的块,然后使用RSA加密每个文本并将其连接在一起?我只是在猜..


问题答案:

OAEP的默认设置是将SHA-1用于MGF1(但请参见此答案末尾的编辑内容)。请注意,选择的哈希对OAEP的安全性影响不大,因此大多数情况下将保留此默认值。

我们可以通过针对"OAEPPadding"和进行测试,轻松地对其进行测试OAEPParameterSpec

// --- we need a key pair to test encryption/decryption
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024); // speedy generation, but not secure anymore
KeyPair kp = kpg.generateKeyPair();
RSAPublicKey pubkey = (RSAPublicKey) kp.getPublic();
RSAPrivateKey privkey = (RSAPrivateKey) kp.getPrivate();

// --- encrypt given algorithm string
Cipher oaepFromAlgo = Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING");
oaepFromAlgo.init(Cipher.ENCRYPT_MODE, pubkey);
byte[] ct = oaepFromAlgo.doFinal("owlstead".getBytes(StandardCharsets.UTF_8));

// --- decrypt given OAEPParameterSpec
Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding");
OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-1"), PSpecified.DEFAULT);
oaepFromInit.init(Cipher.DECRYPT_MODE, privkey, oaepParams);
byte[] pt = oaepFromInit.doFinal(ct);
System.out.println(new String(pt, StandardCharsets.UTF_8));

如果”SHA-256”将MGF1替换为参数,则代码将失败,并出现与填充相关的异常。

完全需要扩展算法的原因是与其他Cipher算法的兼容性。例如编写的代码”RSA/ECB/PKCS1Padding”不使用任何参数,更不用说OAEP参数了。因此,如果没有更长的字符串,OAEP不能作为替换的替代品。

“ECB”在这种情况下,操作模式并不意味着任何东西,应该已经”None”或应该完全省去。您只能使用SunRSA提供程序的RSA实现加密单个块。

如果要加密更多数据,请创建一个随机(AES)对称密钥,然后使用OAEP对其进行加密。然后使用AES密钥加密您的特定数据。这被称为混合密码系统,因为它同时使用非对称和对称原语来加密数据。

请注意,JDK 7(1.7)或更早版本不支持OAEP。自Java 8起,OAEP已包含在Java运行时的实现要求中:

  • RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024、2048)
  • RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024、2048)

某些协议可能会要求您在填充内使用SHA-256或SHA-512,因为不建议使用SHA-1进行大多数使用-即使SHA-1不能直接用于这种目的。

编辑:这主要是考虑到Java编写的。到现在为止,许多其他库似乎采取了一些不同的方法,并为(和大多数为空的)标签和MGF1使用了相同的哈希。如果OAEP密文无效,则应首先确保使用正确的“默认”。选择任何自己的默认库都不可能犯错。最后由协议来定义所使用的哈希。不幸的是,不存在强制性默认值-如果协议所有者忘记为算法完全指定配置,则尤其是一个问题。



 类似资料:
  • 问题内容: 我在Oracle的Java标准加密提供程序中发现了困难的方法 使用以SHA-1实例化的MFG1;SHA-256仅用于对标签进行哈希处理(实际上是空的)。我发现在MFG1中实际使用SHA-256的唯一解决方案(得到该答案和注释的帮助)是使用以下替代形式Cipher.init: 问:有没有转变是会认识到,与类似的效果,除了与MGF1使用SHA-256? 问题答案: 不,没有。 Java是开

  • 问题内容: Java有一种称为的模式。那有什么意思? RFC3447, 公开密钥密码标准(PKCS)#1:RSA密码规范2.1版 ,第 7.1.2 节 解密操作 说,哈希和MGF都是RSAES-OAEP- DECRYPT的选项。MGF是它自己的功能,在 B.2.1节MGF1中 定义,并且还具有自己的哈希“选项”。 也许RSAES-OAEP- DECRYPT和MGF1中的哈希“选项”应该是相同的,或

  • 我尝试使用“RSA/ECB/PKCS7Padding”进行加密。JCE不支持它。所以我下载了Bouncy Castle,但Bouncy Castle似乎也不支持这种转换。以下代码: 投掷 我做得对吗? 蒂亚。

  • 我通常会在这里找到我们大部分问题的答案,但这次我需要问:-)。 我们在Android 8.0(API级别26)上运行的一个应用程序中遇到了RSA加密/解密问题。 我们一直在将RSA与“RSA/ECB/OAEPWithSHA-256AndMGF1Padding”一起使用,这在Android 7.1之前的所有版本上都能正常工作。在Android 8.0上运行的同一代码在调用Cipher时引发了非法Bl

  • 我能够让SCRAM-SHA-256身份验证与pgpool一起使用,但是我还没有找到一个很好的例子来设置pgbouner。我正在尝试使用auth_query。在postgres中,pgbounker将连接的用户将密码加密并存储在SCRAM-SHA-256中。但是我不知道如何在userlist.txt.中创建条目这应该是格式: 存储密钥和服务器密钥到底是什么,我如何生成它们?我可以使用哪些工具来创建它

  • 为什么他们不一样?我需要如何更改java版本以使其与Go版本完全相同?