我在密码学这类事情上完全是个新手。我不知道(也不想知道)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”。
1条答案
按热度按时间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“);签名验证比较是否成功。
注解
适用于iOS的PKCS#1 v1.5
关于iOS中的填充,请查看托马斯Pornin的this answer。基本上,您应该创建SHA-256散列,前缀一个静态数据块(在PKCS#1规范中定义),然后使用
kSecPaddingPKCS1
。为了方便起见,PKCS#1定义的数据块需要以十六进制表示法作为SHA-256的前缀(在标准文档中可能很难找到,在第9.2节的注解中):