在密码学等方面,我是一个全新的人。我不(也不想)知道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)(反之亦然)并获得相同的行为吗? / p>
做这种事情的建议解决方案是什么?
谢谢!
编辑: 我没有提到我使用通过执行以下操作获得的私钥来签署数据:
KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(new FileInputStream(new File(filename)), password.toCharArray());
PrivateKey privateKey = (PrivateKey)keystore.getKey(alias, password.toCharArray());
其中filename是例如:“/ somewhere / mykey.p12”。
答案 0 :(得分:18)
"SHA256withRSA"
在使用SHA256计算数据的哈希值后,使用正式名称RSASSA-PKCS1-v1_5实现PKCS#1 v1.5填充和模幂运算。
所以一般的顺序是:
用于加密和签名生成的填充是不同的,因此使用加密可能会导致错误的签名。
PKCS#1 v1.5填充方案已被PSS取代。对于新协议,建议使用PSS方案。对于RSA,存在非常易读的公共标准。该标准也被用作RFC 3447: Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1的基础(基本上是副本)。
关于iOS中的填充,请查看Thomas Pornin的this answer。基本上你应该创建SHA-256哈希,为静态数据块添加前缀(在PKCS#1规范中定义),然后使用SecKeyRawSign
使用kSecPaddingPKCS1
。
为方便起见,PKCS#1定义的数据块需要以十六进制表示法为SHA-256加上前缀(在标准文档中很难找到它,它在section 9.2的注释中):
30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20
注意: