密码学基础--RSA签名,你该选什么填充模式?
目录
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,那么签名值就变成唯一确定的。
-
汽车测试网V课堂
-
微信公众号
-
汽车测试网手机站
编辑推荐
最新资讯
-
Plus为自动驾驶卡车功能添加了H.E.L.P.警报
2024-12-23 17:18
-
美国能源部发布最新版氢计划
2024-12-23 17:16
-
系统级封装(SiP)在新能源汽车领域的应用
2024-12-23 08:51
-
车载通信框架 --- 智能汽车车载通信架构浅
2024-12-23 08:40
-
全国首例!武汉车网智联公司完成智能网联测
2024-12-23 08:39