SHA256与RSA有什么作用,以什么顺序?

2022-09-01 16:02:21

在密码学和类似的事情方面,我是一个完全的新手。我不知道(也不想)知道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”。


答案 1

"SHA256withRSA"在使用 SHA256 计算数据的哈希值后,实现 PKCS#1 v1.5 填充和模块化幂,正式名称为 RSASSA-PKCS1-v1_5

所以一般的顺序是:

  1. 散列;
  2. 填充哈希以生成签名;
  3. 使用私有指数和模量的模幂。

用于加密和签名生成的填充不同,因此使用加密可能会导致错误的签名。


PKCS#1 v1.5 填充方案已被 PSS 取代。对于新协议,建议改用 PSS 方案。对于 RSA,存在一个非常可读的公共标准。该标准还被用作RFC 3447:公钥加密标准(PKCS)#1:RSA加密规范版本2.1(基本上是副本)的基础。


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

为方便起见,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

笔记:

  • 上述步骤不包括从字节到整数的转换,反之亦然。原始 RSA 操作的结果通常转换为无符号大端编码,其模数大小与字节数相同(通常与密钥大小相同,因为密钥大小已经是 8 的倍数)。这些转换在RFC中称为I2OSP和OS2IP。

答案 2

推荐