使用 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 的相关文章

  • 如何使用 FileChannel 将一个文件的内容附加到另一个文件的末尾?

    File a txt好像 ABC File d txt好像 DEF 我正在尝试将 DEF 附加到 ABC 所以a txt好像 ABC DEF 我尝试过的方法总是完全覆盖第一个条目 所以我总是最终得到 DEF 这是我尝试过的两种方法 File
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • 如何在 Java 中禁用 System.out 以提高速度

    我正在用 Java 编写一个模拟重力的程序 其中有一堆日志语句 到 System out 我的程序运行速度非常慢 我认为日志记录可能是部分原因 有什么方法可以禁用 System out 以便我的程序在打印时不会变慢 或者我是否必须手动检查并
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • 当分配给变量时,我可以以某种方式重用 Gremlin GraphTraversals 代码吗?

    我有看起来像这样的 GraphTraversals attrGroup GraphTraversal
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个

随机推荐