使用 SHA-256AndMGF1Padding 分解 RSA/ECB/OAEP

2024-01-14

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

RFC3447 https://www.rfc-editor.org/rfc/rfc3447#section-7.1.2, 公钥加密标准 (PKCS) #1:RSA 加密规范版本 2.1, 部分7.1.2 解密操作说 Hash 和 MGF 都是 RSAES-OAEP-DECRYPT 的选项。 MGF 是它自己的函数,定义于B.2.1 节 MGF1并且它也有自己的哈希“选项”。

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

欧洲央行在这种背景下意味着什么? ECB 是一种对称分组密码模式。电子密码本。也许它应该意味着Java如何处理大于模数的明文?就像也许将明文分割成与模数一样大的块,然后用 RSA 加密每个块并将它们连接在一起?我只是猜测..


OAEP 使用单独的哈希调用来哈希标签(通常为空)以及 MGF1(掩码生成函数)的参数,用于大多数 OAEP 填充。

该哈希对 OAEP 的安全性没有太大影响,因此可以保留此默认值。然而,大多数库对 MGF-1 和(始终为空)标签的散列使用相同的散列算法。然而,Java 默认使用 MGF1。

我们可以通过比较使用实例化的标准 Java Cipher 来轻松测试这一点"OAEPWITHSHA-256ANDMGF1PADDING"针对一个实例化使用"OAEPPadding" and 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 作为参数,表明 SHA-1 确实是默认值。

需要长算法字符串的原因是与其他算法的兼容性Cipher算法。编写的代码,例如"RSA/ECB/PKCS1Padding"不使用任何参数;因此,如果没有更长的字符串,OAEP 就不能起到替换中的删除作用。


运作方式"ECB"在这种情况下没有任何意义,它应该是"None"或者它应该被完全排除在外。您只能使用 SunRSA 提供程序的 RSA 实现来加密单个块。

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


请注意,JDK 7 (1.7) 或更早版本不支持 OAEP。 OAEP 包含在 Java 运行时的实现要求中从 Java 8 开始 https://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#impl:

  • 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 使用正确的“默认值”。

任何库实现都不可能因为选择自己的默认值而出错;最后由协议来定义所使用的哈希值。

不幸的是,不存在强制默认值 - 如果协议所有者忘记完全指定算法的配置,这尤其是一个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SHA-256AndMGF1Padding 分解 RSA/ECB/OAEP 的相关文章

  • 插入最大日期(独立于数据库)

    在我的本地设置中 我使用一个简单的 H2 数据库 托管 解决方案将有另一个 类似但不相同 数据库 我需要将最大可能日期插入到日期时间列中 我尝试使用 Instant MAX 但是 这会导致列中出现 169104626 12 11 20 08
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • 在 S3 中迭代对象时出现“ConnectionPoolTimeoutException”

    我已经使用 aws java API 一段时间了 没有遇到太多问题 目前我使用的是库 1 5 2 版本 当我使用以下代码迭代文件夹内的对象时 AmazonS3 s3 new AmazonS3Client new PropertiesCred
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 如何使用 Maven 打包并运行具有依赖项的简单命令行应用程序?

    我对 java 和 Maven 都是全新的 所以这可能非常简单 如果我遵循maven2hello world此处的说明 http maven apache org guides getting started maven in Five m
  • Java 8 流 - 合并共享相同 ID 的对象集合

    我有一系列发票 class Invoice int month BigDecimal amount 我想合并这些发票 这样我每个月都会收到一张发票 金额是本月发票金额的总和 例如 invoice 1 month 1 amount 1000
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 以编程方式在java的resources/source文件夹中创建文件?

    我有两个资源文件夹 src 这是我的 java 文件 资源 这是我的资源文件 图像 properties 组织在文件夹 包 中 有没有办法以编程方式在该资源文件夹中添加另一个 properties 文件 我尝试过这样的事情 public s
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s

随机推荐