ios SHA256withRSA它做什么,以什么顺序?

ivqmmu1c  于 2023-03-14  发布在  iOS
关注(0)|答案(1)|浏览(180)

我在密码学这类事情上完全是个新手。我不知道(也不想知道)SHA 256和RSA的细节。我“知道”它们是做什么的,但不知道它们是怎么做的,现在这就足够了。
我想知道“SHA 256 withRSA”算法(如果你可以这样称呼它的话)实际上是做什么的,以什么顺序。例如,它是用SHA 256散列数据,然后用RSA加密它,还是反之亦然,或者其他什么?
我问这个问题的原因是因为我想做一个java的等价物:

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

在iOS上的Objective-C中,我似乎找不到任何东西可以做到这一点,所以我问,我可以只是散列数据(SHA 256),然后加密它(RSA)(反之亦然),并获得相同的行为吗?
对于这种事情,建议的解决方案是什么?
谢谢大家!
编辑:我没有提到我使用私钥对数据进行签名,该私钥是通过执行以下操作获得的:

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

其中,文件名例如为:“/某个地方/mykey.p12”。

6yoyoihd

6yoyoihd1#

带RSA的SHA 256的定义

"SHA256withRSA"在使用SHA 256计算数据的哈希值之后,使用形式名称RSASSA-PKCS 1-v1_5实现PKCS#1 v1.5填充和模幂运算。

签名生成

签名生成的一般策略是:
1.散列该消息;
1.填充散列以用于签名生成;
1.使用OS 2 IP将先前结果转换为数字;
1.使用私有指数和模数的模幂运算;
1.使用I2 OSP将先前结果转换为八位字节字符串。

签名验证

签名验证策略由两部分组成。
第一部分:
1.散列;
1.使用用于签名生成的相同方法填充散列;
第1部分的结果是本地生成的填充哈希(称为EM“)。
第二部分:
1.使用OS 2 IP将签名转换为数字;
1.使用public指数和模数的模幂运算;
1.使用I2 OSP将先前结果转换为八位字节字符串。
第2部分的结果是原始的填充哈希(称为EM)。
最后,比较原始和本地填充散列(EM和EM“);签名验证比较是否成功。

注解

  • PKCS#1 v2.0以后的PSS方案被设计为提供一种非确定性方案,该方案具有更好的填充安全性证明。对于新协议,建议使用PSS方案代替,尽管PKCS#1 v1.5方案仍然被认为是安全的。
  • 签名生成过程中的模幂运算不能使用私有指数;如果CRT参数存在于~4x加速比,则它经常使用中国剩余定理。
  • OS 2 IP通过将一个八位字符串(或字节数组)解释为静态大小的无符号大端值来将其转换为整数,I2 OSP执行相反的操作。如果运行时可以直接对二进制表示执行大整数计算,则转换是隐式的(即根本不需要执行)。
  • 用于加密和签名生成的PKCS#1 v1.5填充是不同的,因此使用加密可能导致错误的签名。
  • 另一种验证方法是从填充中提取散列,并对散列值进行比较。

适用于iOS的PKCS#1 v1.5

关于iOS中的填充,请查看托马斯Pornin的this answer。基本上,您应该创建SHA-256散列,前缀一个静态数据块(在PKCS#1规范中定义),然后使用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

相关问题