5. Cryptographic Primitives (密码学原语)
密码学原语 (Cryptographic Primitives) 是可以构建密码学方案的基本数学运算. 它们旨在用硬件实现或作为软件模块,并且不打算脱离方案单独提供安全性.
本文档规定了四种类型的原语,成对组织: 加密和解密 (Encryption and Decryption); 签名和验证 (Signature and Verification).
原语的规范假设输入满足某些条件,特别是RSA公钥和私钥是有效的.
5.1. Encryption and Decryption Primitives (加密和解密原语)
加密原语 (Encryption Primitive) 在公钥的控制下从消息代表值生成密文代表值,解密原语 (Decryption Primitive) 在相应私钥的控制下从密文代表值恢复消息代表值.
本文档定义的加密方案中使用一对加密和解密原语,在此规定: RSA加密原语 (RSAEP, RSA Encryption Primitive) / RSA解密原语 (RSADP, RSA Decryption Primitive). RSAEP和RSADP涉及相同的数学运算,只是输入不同的密钥. 此处定义的原语与IEEE 1363 [IEEE1363] 中使用RSA的整数分解加密原语 (IFEP-RSA) / 使用RSA的整数分解解密原语 (IFDP-RSA) 相同(除了添加了对多素数RSA的支持),并且与PKCS #1 v1.5兼容.
每个原语中的主要数学运算是幂运算 (Exponentiation).
5.1.1. RSAEP
RSAEP ((n, e), m)
输入 (Input)
(n, e) RSA公钥
m 消息代表值,一个介于0和n - 1之间的整数
输出 (Output)
c 密文代表值,一个介于0和n - 1之间的整数
错误 (Error)
"message representative out of range" (消息代表值超出范围)
假设 (Assumption)
RSA公钥 (n, e) 是有效的
步骤 (Steps)
步骤1. 如果消息代表值m不在0和n - 1之间,输出 "message representative out of range" 并停止.
步骤2. 令 c = m^e mod n.
步骤3. 输出c.
5.1.2. RSADP
RSADP (K, c)
输入 (Input)
K RSA私钥,其中K具有以下形式之一:
- 对 (n, d)
- 五元组 (p, q, dP, dQ, qInv) 和可能为空的三元组序列 (r_i, d_i, t_i), i = 3, ..., u
c 密文代表值,一个介于0和n - 1之间的整数
输出 (Output)
m 消息代表值,一个介于0和n - 1之间的整数
错误 (Error)
"ciphertext representative out of range" (密文代表值超出范围)
假设 (Assumption)
RSA私钥K是有效的
步骤 (Steps)
步骤1. 如果密文代表值c不在0和n - 1之间,输出 "ciphertext representative out of range" 并停止.
步骤2. 消息代表值m按如下方式计算:
a. 如果使用K的第一种形式 (n, d),令 m = c^d mod n.
b. 如果使用K的第二种形式 (p, q, dP, dQ, qInv) 和 (r_i, d_i, t_i),按以下步骤进行:
i. 令 m_1 = c^dP mod p 且 m_2 = c^dQ mod q.
ii. 如果 u > 2,令 m_i = c^(d_i) mod r_i, i = 3, ..., u.
iii. 令 h = (m_1 - m_2) * qInv mod p.
iv. 令 m = m_2 + q * h.
v. 如果 u > 2,令 R = r_1 且对于 i = 3 到 u 执行:
- 令 R = R * r_(i-1).
- 令 h = (m_i - m) * t_i mod r_i.
- 令 m = m + R * h.
步骤3. 输出m.
注意: 步骤2.b可以重写为单个循环,前提是颠倒p和q的顺序. 然而,为了与PKCS #1 v2.0保持一致,前两个素数p和q与额外素数分开处理.
5.2. Signature and Verification Primitives (签名和验证原语)
签名原语 (Signature Primitive) 在私钥的控制下从消息代表值生成签名代表值,验证原语 (Verification Primitive) 在相应公钥的控制下从签名代表值恢复消息代表值. 本文档定义的签名方案中使用一对签名和验证原语,在此规定: RSA签名原语版本1 (RSASP1, RSA Signature Primitive, version 1) / RSA验证原语版本1 (RSAVP1, RSA Verification Primitive, version 1).
此处定义的原语与IEEE 1363 [IEEE1363] 中使用RSA的整数分解签名原语版本1 (IFSP-RSA1) / 使用RSA的整数分解验证原语版本1 (IFVP-RSA1) 相同(除了添加了对多素数RSA的支持),并且与PKCS #1 v1.5兼容.
每个原语中的主要数学运算是幂运算,与第5.1节的加密和解密原语相同. RSASP1和RSAVP1与RSADP和RSAEP相同,只是输入和输出参数的名称不同;它们之所以区分是因为它们用于不同的目的.
5.2.1. RSASP1
RSASP1 (K, m)
输入 (Input)
K RSA私钥,其中K具有以下形式之一:
- 对 (n, d)
- 五元组 (p, q, dP, dQ, qInv) 和(可能为空的)三元组序列 (r_i, d_i, t_i), i = 3, ..., u
m 消息代表值,一个介于0和n - 1之间的整数
输出 (Output)
s 签名代表值,一个介于0和n - 1之间的整数
错误 (Error)
"message representative out of range" (消息代表值超出范围)
假设 (Assumption)
RSA私钥K是有效的
步骤 (Steps)
步骤1. 如果消息代表值m不在0和n - 1之间,输出 "message representative out of range" 并停止.
步骤2. 签名代表值s按如下方式计算:
a. 如果使用K的第一种形式 (n, d),令 s = m^d mod n.
b. 如果使用K的第二种形式 (p, q, dP, dQ, qInv) 和 (r_i, d_i, t_i),按以下步骤进行:
- 令 s_1 = m^dP mod p 且 s_2 = m^dQ mod q.
- 如果 u > 2,令 s_i = m^(d_i) mod r_i, i = 3, ..., u.
- 令 h = (s_1 - s_2) * qInv mod p.
- 令 s = s_2 + q * h.
- 如果 u > 2,令 R = r_1 且对于 i = 3 到 u 执行:
- a. 令 R = R * r_(i-1).
- b. 令 h = (s_i - s) * t_i mod r_i.
- c. 令 s = s + R * h.
步骤3. 输出s.
注意: 步骤2.b可以重写为单个循环,前提是颠倒p和q的顺序. 然而,为了与PKCS #1 v2.0保持一致,前两个素数p和q与额外素数分开处理.
5.2.2. RSAVP1
RSAVP1 ((n, e), s)
输入 (Input)
(n, e) RSA公钥
s 签名代表值,一个介于0和n - 1之间的整数
输出 (Output)
m 消息代表值,一个介于0和n - 1之间的整数
错误 (Error)
"signature representative out of range" (签名代表值超出范围)
假设 (Assumption)
RSA公钥 (n, e) 是有效的
步骤 (Steps)
步骤1. 如果签名代表值s不在0和n - 1之间,输出 "signature representative out of range" 并停止.
步骤2. 令 m = s^e mod n.
步骤3. 输出m.