RSASSA-PSS 将 RSASP1 和 RSAVP1 原语与 EMSA-PSS 编码方法结合起来。
1、签名生成运算:
输入: K 签名者的 RSA 私钥
M 待签名的消息,是一个八位组串
输出: S 签名,是一个长度为 k 的八位组串,这里 k 是 RSA 数模 n 的以八位组为计量单位的长度
步骤:
1. EMSA-PSS编码: EM = EMSA-PSS-ENCODE (M, modBits – 1)。
modBits 是 RSA 数模 n 的比特长度
2. RSA签名:
a. 将编码消息 EM 转换成一个整数消息代表: m = OS2IP (EM) 。
b. 产生一个整数签名代表: s = RSASP1 (K, m) 。
c. 将签名代表 s 转换成长度为 k 个八位组的签名: S = I2OSP (s, k) 。
3. 输出签名代表 S 。
2、签名验证运算:
输入: (n, e) 签名者的RSA公钥
M 签名待验证的消息,是一个八位组串
S 待验证的签名,是一个长度为 k 的八位组串,其中 k 是 RSA 数模 n 的八位组长度
输出: “有效的签名”或者“无效的签名”
步骤:
1. 长度检查: 如果签名 S 的长度不是 k 个八位组,则输出“无效的签名”然后中止运算。
2. RSA验证:
a. 将签名S转换为一个整数签名代表: s = OS2IP (S) 。
b. 产生一个整数消息代表: m = RSAVP1 ((n, e), s) 。
c. 将消息代表m转换成长度为 emLen = (modBits – 1)/8 个八位组的编码消息: EM = I2OSP (m, emLen) 。
其中 modBits 是 RSA 数模 n 的比特长度.
3. EMSA-PSS验证: Result = EMSA-PSS-VERIFY (M, EM, modBits – 1)。
4. 如果Result =“consistent”,则输出“有效签名”。否则,输出“无效的签名”。
3、上述涉及到的算法
a、I2OSP(Integer-to-Octet-String primitive),把一个非负整数转换为一个长度指定的字节串。
b、OS2IP(Octet-String-to-Integer primitive),将一个八位组串转换成一个非负整数。
c、RSASP1(RSA signature primitives),签名原语。 s = RSASP1 (K, m) = m^d mod n。
d、RSAVP1(RSA verification primitives),验证原语。m = RSAVP1 ((n, e), s) = s^e mod n。
e、EMSA-PSS-ENCODE 和 EMSA-PSS-VERIFY,(PSS:Probabilistic Signature Scheme),RSASSA-PSS 有四个选项,这四个选项就是用于这个算法。具体描述见《PKCS_#1_v2.1_RSA_算法标准.pdf》p33。
f、 I2OSP 和 OS2IP 是数据转换原语; RSASP1 和 RSAVP1 是签名和验证原语; EMSA-PSS 是带附属的签名的编码方法。
g、MGF1SHA1,是一个基于散列函数 SHA1 的掩模生成函数。其主要就是循环的做一些 I2OSP 和 Hash 操作。
4、RSA-PSS-Default
其是四个选项值取默认值的 RSASSA-PSS 算法。
RSASSA-PSS-params ::= SEQUENCE {
hashAlgorithm [0] HashAlgorithm DEFAULT sha1,
maskGenAlgorithm [1] MaskGenAlgorithm DEFAULT mgf1SHA1,
saltLength [2] INTEGER DEFAULT 20,
trailerField [3] TrailerField DEFAULT trailerFieldBC
}
5、参考
本文所有部分都归纳于:《PKCS_#1_v2.1_RSA_算法标准.pdf》,是PKI论坛翻译的,从网上可以搜索得到;
其他的参考还有《rfc4055.txt.pdf》和《pkcs-1v2-1.pdf》。
RSASSA-PSS 在 openssl 中的支持,可参考:http://www.pubbs.net/201006/openssl/40713-questions-about-rsassa-pss.html 中六楼 Steve 的发言。