9. Encoding Methods for Signatures with Appendix (带附录签名的编码方法)
编码方法用于将消息转换为编码消息,编码消息随后可以通过RSA签名原语进行签名. 本节规定了两种编码方法: EMSA-PSS和EMSA-PKCS1-v1_5.
9.1. EMSA-PSS
EMSA-PSS (Encoding Method for Signatures with Appendix - Probabilistic Signature Scheme) 是一种概率编码方法,包含随机性,因此对于给定的消息可以生成多个不同的编码消息.
9.1.1. Encoding Operation (编码操作)
EMSA-PSS-ENCODE (M, emBits)
输入 (Input):
- M: 要编码的消息,长度为任意的八位字节串
- emBits: 编码消息的最大比特长度,至少为8hLen + 8sLen + 9
输出 (Output):
- EM: 编码消息,长度为emLen = ⌈emBits/8⌉的八位字节串
步骤 (Steps):
-
如果M的长度大于哈希函数Hash的输入限制(2^61 - 1个八位字节对于SHA-1),输出 "message too long" 并停止.
-
令mHash = Hash(M),长度为hLen的八位字节串.
-
如果emLen < hLen + sLen + 2,输出 "encoding error" 并停止.
-
生成长度为sLen的随机八位字节串salt.
-
令M' = (0x)00 00 00 00 00 00 00 00 || mHash || salt; M'是长度为8 + hLen + sLen的八位字节串.
-
令H = Hash(M'),长度为hLen的八位字节串.
-
生成由emLen - sLen - hLen - 2个零八位字节组成的八位字节串PS.
-
令DB = PS || 0x01 || salt; DB是长度为emLen - hLen - 1的八位字节串.
-
令dbMask = MGF(H, emLen - hLen - 1).
-
令maskedDB = DB ⊕ dbMask.
-
将maskedDB的最左边8emLen - emBits位设置为零.
-
令EM = maskedDB || H || 0xbc.
-
输出EM.
9.1.2. Verification Operation (验证操作)
EMSA-PSS-VERIFY (M, EM, emBits)
输入 (Input):
- M: 消息,长度为任意的八位字节串
- EM: 要验证的编码消息,长度为emLen = ⌈emBits/8⌉的八位字节串
- emBits: 编码消息的最大比特长度
输出 (Output):
- "consistent" (一致) 或 "inconsistent" (不一致)
步骤: (验证步骤与编码步骤相反,检查所有约束)
9.2. EMSA-PKCS1-v1_5
EMSA-PKCS1-v1_5 (Encoding Method for Signatures with Appendix - PKCS #1 v1.5) 是一种确定性编码方法,对于给定的消息总是生成相同的编码消息.
EMSA-PKCS1-v1_5-ENCODE (M, emLen)
输入 (Input):
- M: 要编码的消息,长度为任意的八位字节串
- emLen: 编码消息的预期长度(以八位字节为单位),至少为tLen + 11,其中tLen是DigestInfo值的八位字节长度
输出 (Output):
- EM: 编码消息,长度为emLen的八位字节串
步骤 (Steps):
-
对消息M应用哈希函数以生成哈希值H: H = Hash(M). 如果哈希函数输出 "message too long",输出 "message too long" 并停止.
-
使用第9.2节注释中的技术,将DigestInfo值编码为T,用于哈希函数.
-
如果emLen < tLen + 11,输出 "intended encoded message length too short" 并停止.
-
生成由emLen - tLen - 3个值为0xff的八位字节组成的八位字节串PS.
-
连接PS和其他填充以形成编码消息EM: EM = 0x00 || 0x01 || PS || 0x00 || T
-
输出EM.