您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

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

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运行时的实现要求中:

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

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

其他 2022/1/1 18:13:33 有1023人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶