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的结构如下:

  1. 填充部分:由全0的字节组成,长度为8 zeros(固定8字节)。
  2. 哈希标识符:一个固定的字节序列(例如SHA-256的OID编码),但现代实现常简化为空或省略。
  3. 盐值:将步骤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进行掩码:

  1. 以H作为输入,通过MGF生成与DB长度相同的掩码mask
  2. 计算掩码后的数据块:
    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. 验证过程简述

验证时,接收方:

  1. 用公钥解密签名得到EM'。
  2. 检查EM'的尾部是否为0xBC。
  3. 分离EM'得到edB'和H'。
  4. 重新计算H'' = Hash(mHash || salt')(从edB'中提取salt')。
  5. 对比H'与H'',一致则签名有效。

通过以上步骤,RSA-PSS实现了高安全性的数字签名,广泛应用于TLS、代码签名等领域。

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、代码签名等领域。