SHA256withRSA 它是做什么的,顺序是什么?

问题描述 投票:0回答:1

在密码学等方面,我完全是个新手。我不(也不想)知道 SHA256 和 RSA 的细节。我“知道”他们做了什么,但不知道他们是怎么做的,现在这就足够了。

我想知道“SHA256withRSA”算法(如果你可以这样称呼它的话)实际上是做什么的,顺序是什么。例如,它是否使用 SHA256 对数据进行哈希处理,然后使用 RSA 对其进行加密,或者反之亦然,还是其他方式?

我问的原因是因为我想做 java 相当于:

Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey); //privateKey == a key extracted from a .p12 file

在 iOS 上的 Objective-C 中。而且我似乎找不到任何能做到这一点的东西,因此我问,我可以只散列数据(SHA256)然后加密它(RSA)(反之亦然)并获得相同的行为吗?

做这种事情的建议解决方案是什么?

谢谢!

编辑: 我没有提到我使用通过以下方式获得的私钥对数据进行签名:

KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(new FileInputStream(new File(filename)), password.toCharArray());
PrivateKey privateKey = (PrivateKey)keystore.getKey(alias, password.toCharArray());

文件名例如:“/somewhere/mykey.p12”。

java ios cryptography rsa sha256
1个回答
35
投票

SHA256withRSA的定义

"SHA256withRSA"
在使用 SHA256 对数据进行哈希计算后,使用正式名称 RSASSA-PKCS1-v1_5 实现 PKCS#1 v1.5 填充和模幂运算。

签名生成

签名生成的总体策略是:

  1. 散列消息;
  2. 为签名生成填充哈希;
  3. 使用 OS2IP 将先前的结果转换为数字;
  4. 使用private指数和模数进行模幂运算;
  5. 使用 I2OSP 将先前的结果转换为八位字节串。

签名验证

签名验证策略由两部分组成

第 1 部分:

  1. 散列;
  2. 使用与签名生成相同的方法填充哈希;

第 1 部分的结果是本地生成的填充哈希(称为 EM')。

第 2 部分:

  1. 使用 OS2IP 将签名转换为数字;
  2. 使用 public 指数和模数进行模幂运算;
  3. 使用 I2OSP 将先前的结果转换为八位字节串。

第 2 部分的结果是原始的填充哈希(称为 EM)。

最后比较原始和本地填充的哈希值(EM和EM');签名验证比较是否成功。

注意事项

  • PKCS#1 v2.0 及更高版本中的 PSS 方案旨在为填充提供更好的安全性证明的非确定性方案。对于新协议,建议改用 PSS 方案,尽管 PKCS#1 v1.5 方案仍然被认为是安全的。

  • 签名生成时的模幂不能使用私有指数;如果 CRT 参数存在约 4 倍的加速,它经常使用中国剩余定理。

  • OS2IP 通过将八位字节字符串(或字节数组)解释为静态大小的无符号大端值将其转换为整数,I2OSP 执行相反的操作。如果运行时可以直接对二进制表示执行大整数计算,则转换是隐式的(即根本不需要执行)。

  • 用于加密和签名生成的 PKCS#1 v1.5 padding 不同,因此使用加密可能会导致错误的签名。

  • 另一种验证方法是从填充中提取哈希并执行哈希值的比较。


适用于 iOS 的 PKCS#1 v1.5

关于 iOS 中的填充,请查看 Thomas Pornin 的this answer。基本上,您应该创建 SHA-256 哈希,为静态数据块(在 PKCS#1 规范中定义)添加前缀,然后使用

SecKeyRawSign
使用
kSecPaddingPKCS1
.

为了您的方便,PKCS#1 定义的数据块需要以 SHA-256 的十六进制表示法作为前缀(在标准文档中很难找到,它在 9.2 的注释中):

30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20
© www.soinside.com 2019 - 2024. All rights reserved.