首页 > 汽车技术 > 正文

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

2024-08-07 08:26:00·  来源:汽车MCU软件设计  
 

目录

1. OAEP

1.1 加密过程

1.2 解密过程

2 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进行数据编码和填充具体流程如下:

图片

图 1 OAEP填充流程


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,如下图所示:

图片

图 2 OAEP解码过程


  • 根据所选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,最后得到效果如下:

图片

图 3 OAEP填充模式加解密效果


2.PSS


填充模式PSS(Probabilistic Signature Scheme),仅用于签名验签。如选用PSS进行签名、验签,程序中盐值长度配置为DIGEST_LENGTH;mgf支持MD5、SHA224\256\384\512,与签名使用的Hash函数一致。


2.1 签名流程


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

图片

图 4 PSS填充过程


特别注意,


Pad1 = 0x0000 0000,


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


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


2.2 验签流程


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

图片

图 5 PSS验签过程


最终效果如下图所示:


图片


3.小结


一般来讲,RSA多用在数字签名上,加解密上首先是能加解密的数据长度受限于模数长度,其次就是性能问题。那么在数字签名领域,多推荐用PSS填充方式,契合版本RFC 3447:PKCS#1 v2.1,至于以前老版本PKCS#1 v1.5的填充Muscle v01也是可以兼容的。PSS看起来是要比PKCS#1 v1.5签名填充更为复杂,有兴趣可以回顾:为什么RSA公钥加密结果不是固定值?_rsa加密每次结果一样吗-CSDN博客


图片        

图6 PKCS#1V15签名填充


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


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

分享到:
 
反对 0 举报 0 收藏 0 评论 0
沪ICP备11026620号