RSA-PSS(RSA概率签名方案)的数字签名过程
字数 1315 2025-11-02 00:38:44
RSA-PSS(RSA概率签名方案)的数字签名过程
RSA-PSS是RSA数字签名的一种增强方案,通过引入随机化和安全的填充机制,解决了传统RSA签名(如RSA-PKCS#1 v1.5)可能存在的安全隐患(如确定性签名易受攻击)。下面逐步讲解其签名生成过程。
1. 算法输入参数
- 消息(M):待签名的原始数据。
- 私钥(d, N):签名者的RSA私钥,其中d为私钥指数,N为模数。
- 哈希函数(Hash):如SHA-256,用于生成消息摘要。
- 掩码生成函数(MGF):通常基于哈希函数(如MGF1),用于生成随机掩码。
- 盐值(salt):随机生成的字节串(长度由参数sLen指定,例如等于哈希输出长度)。
2. 签名生成步骤
步骤1:生成消息摘要
计算消息M的哈希值:
mHash = Hash(M)
例如,若使用SHA-256,则mHash长度为32字节。
步骤2:生成随机盐值
生成一个长度为sLen的随机盐值salt(例如sLen=32字节)。盐值的随机性确保每次签名结果不同,增强安全性。
步骤3:构造数据块DB
数据块DB的结构如下:
- 填充部分:由全0的字节组成,长度为
8 zeros(固定8字节)。 - 哈希标识符:一个固定的字节序列(例如SHA-256的OID编码),但现代实现常简化为空或省略。
- 盐值:将步骤2的
salt附加到数据块末尾。
最终DB的格式:
DB = 0x00...00 || 0x01 || salt(其中0x00...00为填充0,0x01为分隔符)。
步骤4:计算H
将mHash与salt组合后哈希:
H = Hash(mHash || salt)
这里||表示拼接操作。H的长度等于哈希输出长度(如32字节)。
步骤5:生成掩码edB
使用MGF函数以H为种子,对DB进行掩码:
- 以H作为输入,通过MGF生成与DB长度相同的掩码
mask。 - 计算掩码后的数据块:
edB = DB ⊕ mask(⊕表示按位异或)。
步骤6:构造编码消息EM
EM的结构为:
EM = edB || H || 0xBC
其中:
edB为掩码后的数据块;H为步骤4的输出;0xBC是一个固定的尾部标记(用于区分其他RSA方案)。
步骤7:RSA私钥加密
将EM转换为大整数,并用私钥进行RSA运算:
s = EM^d mod N
结果s即为数字签名。
3. 关键设计特点
- 概率性签名:随机盐值确保同一消息每次签名结果不同,防止攻击者通过统计分析破解私钥。
- 安全性证明:RSA-PSS可证明安全(在随机预言机模型下),抵抗选择消息攻击。
- 掩码机制:MGF防止恶意构造的输入导致签名泄露私钥信息。
4. 验证过程简述
验证时,接收方:
- 用公钥解密签名得到EM'。
- 检查EM'的尾部是否为0xBC。
- 分离EM'得到edB'和H'。
- 重新计算H'' = Hash(mHash || salt')(从edB'中提取salt')。
- 对比H'与H'',一致则签名有效。
通过以上步骤,RSA-PSS实现了高安全性的数字签名,广泛应用于TLS、代码签名等领域。