密码学基础 -- RSA加密、签名填充模式解析(终极图解版)

目录

[1. OAEP](#1. OAEP)

[1.1 加密过程](#1.1 加密过程)

[1.2 解密过程](#1.2 解密过程)

[2 PSS](#2 PSS)

[2.1 签名流程](#2.1 签名流程)

[2.2 验签流程](#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,最后得到效果如下:

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

2 PSS

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

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

2.1 签名流程

其签名流程如下:

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

图 3 PSS填充过程

特别注意,

Pad1 = 0x0000 0000,

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

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

2.2 验签流程

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

图 4 PSS验签过程

最终效果如下图所示:

3.小结

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

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

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

图5 PKCS#1V15签名填充

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

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

相关推荐
Mysticbinary20 天前
椭圆曲线公钥密码算法原理入门
rsa·ecc·公钥密码学
Yaml42 个月前
Spring Boot 安全 API 构建:加密解密功能的卓越实践
服务器·网络·spring boot·安全·aes·rsa
许野平2 个月前
OpenSSL:生成 DER 格式的 RSA 密钥对
服务器·网络·openssl·rsa·pem·der
闲人编程4 个月前
Python实现Paillier同态加密算法
python·算法·密码学·同态加密·加密解密·paillier
一丝晨光4 个月前
Https 加密原理
开发语言·网络·网络协议·http·https·加密·rsa
Tassel_YUE4 个月前
Cisco交换机SSH使用RSA公钥免密登录(IOS与Nexus,服务器以RHEL8为例)
linux·服务器·经验分享·ssh·交换机·cisco·rsa
无名函数4 个月前
《密码编码学与网络安全原理与实践》第九章 第十章 公钥密码学与密钥管理
网络·密码学·rsa·ecc·公钥加密·elgamal
又菜又爱coding5 个月前
Flutter RSA公钥转PEM
flutter·rsa
-代号95275 个月前
系统数据加密传输的实现
非对称加密·aes·jasypt·rsa·对称加密