tangguo

iOS上不同的填充类型之间有什么区别?

android

在iOS上,证书,密钥和信任服务API包含以下填充类型:

kSecPaddingNone
kSecPaddingPKCS1
kSecPaddingPKCS1MD2
kSecPaddingPKCS1MD5
kSecPaddingPKCS1SHA1

苹果CDSA邮件列表上的用户说“ kSecPaddingPKCS1与PKCS#1 1.5相同”。证书,密钥和信任服务参考使用“将完成标准ASN.1填充以及基础RSA操作的PKCS1填充”来注释后三种填充类型(kSecPaddingPKCS1MD2,kSecPaddingPKCS1MD5和kSecPaddingPKCS1SAH)

有什么区别kSecPaddingPKCS1?
是kSecPaddingPKCS1仅仅根据RFC 3447的基本RSA运算的原料填充?
使用签署SHA-256,SHA-384或SHA-512摘要时SecKeyRawSign(),开发人员是否需要自己使用kSecPaddingPKCS1和执行ASN.1填充?ASN.1填充是必需的还是可以省略?
任何指向我正确方向的提示都将受到高度赞赏。


阅读 589

收藏
2020-11-18

共1个答案

小编典典

PKCS#1包含两个用于与RSA签名的“填充”,一个“新”(称为PSS,在版本2.1中添加)和一个“旧”(称为“ v1.5”),因为它已经在PKCS#1.5版中1)。我们正在谈论v1.5填充。

对某些数据进行签名后,首先使用合适的哈希函数(例如SHA-1)对其进行哈希处理,然后将哈希值(如果使用SHA-1,则为20字节)包装到两个连续的层中:

哈希值被编码到基于ASN.1的结构中,该结构还指定使用哪个哈希函数。实际上,如果哈希值是H,则第一个换行将导致字节序列A ||。H,其中| |是连接,而“ A ”是特定于哈希函数的标头(通常为15到20个字节)。

“ A || H ”扩展了一些额外的字节:

0x00 0x01 0xFF 0xFF … 0xFF 0x00 || A || H

将值0xFF的字节数调整为总大小等于RSA模数的大小(即,对于1024位RSA密钥为128字节)。

第二步是PKCS#1所谓的“类型1填充”。

kSecPaddingPKCS1表示该函数仅执行第二步:假定输入数据已经是正确的“ A || H ”。请注意,SSL / TLS(版本1.1之前的版本)使用要求此模式的签名变体(没有“ A ”,但有两个哈希函数)。使用kSecPaddingPKCS1SHA1,签名函数期望将哈希值作为输入,并添加“ A ”标头本身。

对于可以由第三方实现验证的正确的,符合标准的签名,必须在某个时候添加“ A ”标头。您可以自己添加它并使用kSecPaddingPKCS1,或者使用kSecpaddingPKCS1SHA1并让引擎自己添加它,这可能不太容易出错。

(从2011年开始,不建议使用SHA-1;您最好切换到SHA-256或SHA-512。此外,您尝试使用的API似乎是低级的,整个事情都令人怀疑。似乎您想实现自己的加密协议,而不是使用现有的库或框架。)

2020-11-18