java - SHA256withRSA 它是做什么的,顺序是什么?

标签 java ios cryptography rsa sha256

在密码学等方面,我完全是个新手。我不(也不想)知道 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” 使用正式名称 RSASSA-PKCS1-v1_5 实现 PKCS#1 v1.5 填充和模幂运算在使用 SHA256 计算数据的哈希值之后。

所以一般顺序是:

  1. 散列;
  2. 为签名生成填充哈希;
  3. 使用私有(private)指数和模数进行模幂运算。

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


PKCS#1 v1.5 填充方案已被 PSS 取代。对于新协议(protocol),建议改用 PSS 方案。对于 RSA,存在一个非常易读的公共(public)标准。该标准也被用作 RFC 3447: Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1 的基础(这基本上是一个副本)。


关于iOS中的padding,请查看this answer托马斯·波尔宁。基本上,您应该创建 SHA-256 哈希,为静态数据 block (在 PKCS#1 规范中定义)添加前缀,然后使用 kSecPaddingPKCS1 来使用 SecKeyRawSign

为方便起见,PKCS#1 定义的数据 block 需要以 SHA-256 的十六进制表示法作为前缀(在标准文档中很难找到,在 section 9.2 的注释中):

30 31 30 0D 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20

注意事项:

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

关于java - SHA256withRSA 它是做什么的,顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21018355/

相关文章:

ios - 如何搜索所有目录? objective-c

cryptography - 基本的高性能数据真实性

dart - 如何在 flutter dart 中像 android 的 "PBEWithMD5AndDES"那样进行加密?

java - JTable 单元格返回 null

java - 从字符串查询 JSP 中删除引号

ios - Swift:从另一个类调用函数以出现在同一个 WebView 中

iOS UIPageControl 改变位置

windows - BCryptGetFipsAlgorithmMode 使用哪些数据来确定 FIP 状态?

java - 如何解析 "{}"空值(转换为字符串)

java - 对准备好的语句设置超时