分解RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDING

时间:2015-08-22 23:23:07

标签: java encryption cryptography rsa

因此,Java有一种名为RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING的模式。这甚至意味着什么?

RFC3447公钥加密标准(PKCS)#1:RSA加密规范版本2.1 7.1.2解密操作表示Hash和MGF是RSAES-OAEP-DECRYPT的两种选择。 MGF是它自己的功能,在部分B.2.1 MGF1 中定义并且具有它自己的Hash"选项"同样。

也许Hash"选项"在RSAES-OAEP-DECRYPT和MGF1应该是相同的,或者他们可能不是,我不清楚。如果它们是那么我猜你有RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING这意味着sha256应该用于两者。但是如果它们不应该是相同的那么你可以将sha256用于RSAES-OAEP-DECRYPT,例如,sha1用于MGF1。如果是这样的话那么sha256应该用于什么功能呢?什么哈希算法应该用于其他函数?

欧洲央行在这方面的意义是什么? ECB是对称分组密码模式。电子密码本。也许它应该是指Java如何处理比模数更大的明文?就像将明文拆分成与模数一样大的块,然后用RSA对它们进行加密并将它们连接在一起?我只是在猜测..

1 个答案:

答案 0 :(得分:29)

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)