SHA256withRSA它做什么以及以什么顺序?

 双子汐晨_312 发布于 2023-02-04 20:29

在密码学等方面,我是一个全新的人.我不(也不想)知道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());

其中filename是例如:"/ somewhere/mykey.p12".

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

    所以一般的顺序是:

      散列;

      填充哈希以进行签名生成;

      使用私有指数和模数的模幂运算.

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


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


    关于iOS中的填充,请查看Thomas Pornin的答案.基本上,你应该创建SHA-256哈希值,可以在前面数据的静态块然后使用(在PKCS#1的规格所定义的)SecKeyRawSign使用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.

    2023-02-04 20:34 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有