SHA256withRSA的作用和顺序是什么?

关于密码学和诸如此类的事情,我是一个新手。我不知道(也不想知道)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”。

回答:

"SHA256withRSA"在使用SHA256计算数据散列后,以正式名称RSASSA-

PKCS1-v1_5实现PKCS#1 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规范中定义)添加前缀,然后使用SecKeyRawSignusing

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


笔记:

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

以上是 SHA256withRSA的作用和顺序是什么? 的全部内容, 来源链接: utcz.com/qa/435829.html

回到顶部