RSA-PSS数字签名算法
RSA概率签名方案(RSA-PSS)主要是在签名产生过程中将Hash值嵌入到消息中的填充格式,以及随后的签名验证过程中判断Hash值和消息的一种方法。
掩码产生函数
在介绍RSA-PSS操作之前,需要先给出在结构块中使用的掩码产生函数(MGF)。MGF(x,maskLen)是一个伪随机函数,其输入参数是一个任意长度的位串以及需要的输出字节长度L。MGF通常基于安全Hash函数来构造,如SHA-1。基于密码学Hash函数的MGF用于产生任意长度消息的摘要或者hash值,输出固定长度的值。
目前RSA-PSS规范中使用的MGF函数是MGF1,其参数如下:
选项 Hash 输出长度是hLen字节的hash函数
输入 X 被掩码的字节串
maskLen 掩码的字节长度
输出 mask 长度为maskLen字节的串
MGF1的定义如下:
1)初始化变量
T=空字符串
2)计算中间值
for counter = 0 to k
将counter表示为32位串c的形式
T=T || Hash (X||C)
3)输出结果
mask = T 的前maskLen字节
本质上,MGF1的操作过程如下:如果需要的输出长度等于Hash值的长度(maskLen=hLen),则将输入值X的hash值链接取值为0的32位计数器,作为输出。maskLen比hLen大,MGF1继续讲当前处理的串T 与计数器连接并对X计算Hash,因此输出如下:
该过程直到T的长度大于或等于maskLen时结束,这时将T的前maskLen字节作为输出。
签名操作
消息编码:在对消息M生成RSA-PSS签名的第一阶段处理过程是由M生成固定长度的消息摘要,成为消息编码(EM)。先定义如下的参数和函数:
选项 Hash 输出长度是hLen字节的Hash函数。目前的选择是SHA-1,该算法产生20字节的Hash值
MGF 掩码产生函数。目前规范中使用的是MGF1
sLen 盐的字节长度。一般sLen=hLen,当前版本为20字节
输入 M 用于签名的待编码消息
emBits 该数是比RSA模数n位长度小的值
输出 EM 编码后的消息,是用于加密后形成消息签名的消息摘要
参数 emLen
填充1(padding1) 十六进制串 00 00 00 00 00 00 00 00;即64位的0
填充2(padding2) 十六进制串若干个00后面跟着01;其长度为(emLen-sLen-hLen-2)字节
盐(salt) 一组伪随机数
bc BC的十六进制值
在构造消息摘要的过程中,所有基于RSA的数字签名标准方案都使用了一个多个消息扩展(如填充块1和填充块2)。其目的是增大攻击者给定一个消息后找到另一个消息映射到相同的摘要,或者寻找两个消息映射到相同摘要的难度。RSA-PSS也使用了伪随机数,这里成为盐。因为在每次使用时盐的值都会发生改变,所以使用相同的私钥对相同的消息进行两次签名,将得到不同的结果。这增加了签名方案的安全度。
形成签名
下面介绍拥有私钥{d,n}和公钥{e,n}的签名者如何形成签名。讲字节串EM作为无符号的非负二进制整数s。通过如右方式加密m得到签名s:
令k是RSA模数n的字节长度。如RSA的密钥长度是2048位,则k=2048/8=256.然后将计算出的签名值s转换成k字节的串S
签名验证
解密:对于签名的验证,讲签名s作为无符号的非负二进制整数s。消息摘要m通过解密s得到:
然后将消息转换为编码后的消息EM的形式,其长度为 字节,这里modBits是RSA模数n的位长度
上图过程,阴影部分的方块标记为H和H',分别对应着解密后的签名中的值和直接从签名对应的消息中生成的值。剩下的三处阴影部分包括解密后的签名的值中与已知常数的比较部分。(图标1-5)
我们现在能够更清晰的理解签名者生成的EM中嵌入的常数和伪随机盐值的不同作用。验证者知道常数,因此计算出来的常数可以跟已知的常数值相比较,作为对于签名的有效性的额外(除了检查H和H'之外的)检查。盐值使得给定相同的密钥对统一消息会产生不同的签名。验证者不知道盐值,不需要去进行盐值的比较。盐值气到的作用类似于NIST DSA和ECDSA中伪随机变量K的作用。