Khorina · 8月14日

密码学基础--RSA签名,你该选什么填充模式?

目录

  1. OAEP

1.1 加密过程

1.2 解密过程

  1. PSS

2.1 签名流程

2.2 验签流程

3.小结

1. OAEP

填充模式OAEP(Optimal Asymmetric Encryption Padding),仅用于加解密。

1.1 加密过程

使用该填充模式进行加密总共分为三大步骤:

(1)数据长度检查

检查Lable长度是否超过所选Hash函数所能计算的长度,本程序中默认label长度为0;

检查待加密消息m字节长度是否超过 k(模数长度)-2*hLen(所选哈希函数摘要长度)-2;例如使用MGF(mask generation function)选择SHA512时,使用1024bit长度的密钥就不能进行加密。

(2)基于EME-OAEP进行数据编码和填充

具体流程如下:

image.png

DB:data block;PS:Padding string;EM:encoded message

  • 如果检查到输入的label为空,那么对应Hash值如下:

MD 5 =    d41d8cd9 8f00b204 e9800998 ecf8427e

SHA-1 =   da39a3ee 5e6b4b0d 3255bfef 95601890 afd80709

SHA-256=  e3b0c442 98fc1c14 9afbf4c8 996fb924

                   27ae41e4 649b934c a495991b 7852b855

SHA-384=  38b060a7 51ac9638 4cd9327e b1b1e36a

                   21fdb711 14be0743 4c0cc7bf 63f6e1da

                   274edebf e76f65fb d51ad2f1 4898b95b

SHA-512=  cf83e135 7eefb8bd f1542850 d66d8007

                   d620e405 0b5715dc 83f4a921 d36ce9ce

                   47d0d13c 5d85f2b0 ff8318d2 877eec2f

                   63b931bd 47417a81 a538327a f927da3e

  • 生成PS字节串,长度为k-mLen-2*hLen -2,填充为00;
  • 拼接DB = lHash || PS || 0x01 ||M;
  • 生成与Hash函数摘要相同的随机数Seed,通过MGF进行摘要计算后和DB进行异或,作为MaskedDB;
  • MaskedDB经过MGF再次进行摘要计算后与Seed进行异或,得到MaskedSeed;
  • 拼接EM = 00||MaskedSeed||MaskedDB,得到最终的编码消息

 (3)使用公钥进行RSAEP加密,得到密文C = m^e mod n ,(n,e)为公钥参数

1.2 解密过程

解密过程同样也分为三个大步骤:

(1)长度检查:

  • 如果密文长度不能模数长度,返回错误,不进行下一步;
  • 如果模数长度小于2* hLen +2,则返回错误。

(2)RSA解密,公式 m = C^d mod n,d为私钥幂数、n为模数;

(3)最后解码解密出来的明文M,如下图所示:

image.png

  • 根据所选Hash函数对Label生成lHash值,根据加密时EM的数据结构将M拆成 Y || maskedSeed || maskedDB;Y为单字节,maskedDB长度为模数k - hLen - 1,maskedSeed 为Hash长度。使用mgf对maskedDB做运算,得到seedMask;
  • SeedMask xor MaskedSeed得到Seed;
  • Seed通过mgf得到dbMask;
  • MaskedDB xor dbMask得到最终的明文,然后根据字节长度截取出M,最后得到效果如下:

image.png

2.PSS

填充模式PSS(Probabilistic Signature Scheme),仅用于签名验签。

如选用PSS进行签名、验签,程序中盐值长度配置为DIGEST_LENGTH;mgf支持MD5、SHA224\256\384\512,与签名使用的Hash函数一致。

2.1 签名流程

其签名流程如下:

(1)根据PSS需求将原始数据M进行编码,得到与模数相当长度的数据块EM,编码规则如下图所示:

image.png

特别注意,

Pad1 = 0x0000 0000,

Pad2 = 0x00.... || 01,需要填充至模数长度k-len(maskedSeed)-1。

(2)然后使用私钥对EM进行加密,得到最终签名s = m^d mod n;

2.2 验签流程

验签过程就是对签名进行解密,然后比对EM的过程,具体不再赘述, 如下图所示:

image.png

最终效果如下图所示:

image.png

3.小结

一般来讲,RSA多用在数字签名上,加解密上首先是能加解密的数据长度受限于模数长度,其次就是性能问题。

那么在数字签名领域,多推荐用PSS填充方式,契合版本RFC 3447:PKCS#1 v2.1,至于以前老版本PKCS#1 v1.5的填充Muscle v01也是可以兼容的。

PSS看起来是要比PKCS#1 v1.5签名填充更为复杂,有兴趣可以回顾:为什么RSA公钥加密结果不是固定值?_rsa加密每次结果一样吗-CSDN博客

image.png

但从安全性角度来看,由于其可变长度的盐值Salt的不确定性,伪造签名更加困难,同时在2001有专家专门针对PSS发表安全证明论文;

值得一提的是,如果盐值为0,那么签名值就变成唯一确定的。

作者: 快乐的肌肉
文章来源:汽车MCU软件设计

推荐阅读

更多物联网安全,PSA等技术干货请关注平台安全架构(PSA)专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入PSA技术交流群,请备注研究方向。
推荐阅读
关注数
4562
内容数
164
Arm发布的PSA旨在为物联网安全提供一套全面的安全指导方针,使从芯片制造商到设备开发商等价值链中的每位成员都能成功实现安全运行。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息