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

mbi*_*nna 14 security iphone encryption digital-signature ios

在iOS上,Certificate,Key和Trust Services API包含以下填充类型:

  • kSecPaddingNone
  • kSecPaddingPKCS1
  • kSecPaddingPKCS1MD2
  • kSecPaddingPKCS1MD5
  • kSecPaddingPKCS1SHA1

在对用户苹果CDSA邮件列表中称,"kSecPaddingPKCS1 [...]是一样的PKCS#1 1.5".证书,密钥和信任服务参考注释后三种填充类型(kSecPaddingPKCS1MD2,kSecPaddingPKCS1MD5kSecPaddingPKCS1SAH),"标准ASN.1填充将完成,以及底层RSA操作的PKCS1填充".

  1. 有什么区别kSecPaddingPKCS1
  2. kSecPaddingPKCS1仅仅根据RFC 3447的基本RSA运算的原料填充?
  3. 在签署SHA-256,SHA-384或SHA-512摘要时SecKeyRawSign(),开发人员是否需要自己使用kSecPaddingPKCS1并执行ASN.1填充?是否需要ASN.1填充或是否可以省略?

任何暗示我指向正确方向的提示都受到高度赞赏.

Tho*_*nin 21

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

当一些数据被签名时,首先使用合适的散列函数(例如SHA-1)进行散列,然后将散列值(如果使用SHA-1则为20个字节)封装到两个连续的层中:

  1. 散列值被编码到基于ASN.1的结构中,该结构还指定使用了哪个散列函数.实际上,如果散列值为H,则第一次换行将产生字节序列A || H,其中" || "是串联," A "是特定于散列函数的标题(通常为15到20个字节).

  2. " 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似乎是非常低级的,并且整个事情都是可疑的看起来好像你想要实现自己的加密协议而不是使用现有的库或框架.)