OAEP使用单独的哈希调用来哈希(通常为空的)标签以及MGF1的参数(掩码生成函数),用于大多数OAEP填充。
哈希对OAEP的安全性影响不大,因此可以将其保留为默认值。然而,大多数库都会使用相同的哈希算法来进行MGF-1和(始终为空的)标签的哈希。Java默认使用MGF1。
我们可以通过比较使用“OAEPWITHSHA-256ANDMGF1PADDING”实例化的标准Java Cipher与使用“OAEPPadding”和“OAEPParameterSpec”实例化的Cipher来轻松测试此内容:
// --- we need a key pair to test encryption/decryption
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA")
kpg.initialize(1024)
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))
如果您将参数MGF1替换为"SHA-256"
,代码将因与填充相关的异常而失败,这表明SHA-1确实是默认值。
需要长算法字符串的原因是为了与其他Cipher
算法兼容。例如,针对"RSA/ECB/PKCS1Padding"
编写的代码不使用任何参数;如果没有更长的字符串,OAEP因此无法作为替代品。
在这种情况下,操作模式"ECB"
没有意义,应该是"None"
或者完全省略。你只能使用SunRSA提供程序的RSA实现加密单个块。
如果要加密更多数据,请创建一个随机(AES)对称密钥并使用OAEP加密该密钥。然后使用AES密钥加密特定数据。这被称为混合加密系统,因为它使用非对称和对称原语来加密数据。
请注意,OAEP不受JDK 7(1.7)或更早版本支持。OAEP包含在Java运行时的实现要求中自Java 8以来:
RSA/ECB/OAEPWithSHA-1AndMGF1Padding
(1024,2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding
(1024,2048)
一些协议可能要求您在填充中使用SHA-256或SHA-512,因为对于大多数用途而言,SHA-1正在被弃用 - 即使它不直接容易受到此类目的攻击。SHA-224或SHA-384都没有任何意义,因为它们是具有减小输出大小的SHA-256和SHA-512版本,因此需要更多调用来创建填充,而没有提供任何安全优势(是的,测试表明这会导致性能劣势)。
如果您有无效的OAEP密码文本,应首先确保正确使用了标签和MGF1的“默认值”。
选择自己的默认库实现是不可能出错的;最终由协议定义所使用的哈希函数。
不幸的是,不存在强制性默认设置 - 这特别是在协议所有者忘记完全指定算法配置时会造成问题。
RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDING
,BouncyCastle似乎有不同的操作方式。也就是说,虽然Java的默认加密提供程序使用sha1作为MGF哈希,但BouncyCastle似乎使用sha256。这应该需要进行独立验证,但这是我观察到的情况。 - neubert