签名加密(Signcryption):高效联合认证加密的原语与标准
定义与动机
签名加密(Signcryption)是一种密码学原语,由 Anand 和 Koblitz 于 1996 年首次提出,旨在同时提供数字签名的认证性和公钥加密的机密性。在签名加密中,发送方产生一个签名加密文本(signedcryption),接收方仅能解密并验证该文本;任何第三方无法伪造有效签名加密文本,也无法从中提取消息内容。
传统方案采用"先签名后加密"(Sign-then-Encrypt)或"先加密后签名"(Encrypt-then-Sign)的两阶段模式,存在以下问题:
- 计算冗余:两次独立操作导致约 40% 的额外计算开销
- 带宽浪费:签名和密文分别传输,带宽消耗增加约 50%
- 实现复杂度:需保证签名与加密操作的顺序一致性
构造范式
通用构造框架
ISO/IEC 14888-3 定义了签名加密的通用框架,包含四个算法:
- KeyGen:生成签名加密密钥对
- Signcrypt:发送方生成签名加密文本
- Unsigncrypt:接收方解密并验证
- Verify:第三方验证签名有效性
- 不可区分性:对抗选择明文攻击(IND-SC-CPA)和选择密文攻击(IND-SC-CCA)
- 不可伪造性:对抗外部攻击者(OU-SC-CMA)和内部攻击者(IU-SC-CMA)
基于配对的构造
早期签名加密方案多基于双线性配对,如 Boneh-Lundmark-Naor(BLN)方案:
发送方 A 到接收方 B:
1. 选取随机 r
2. 计算 U = [r]G₁(G₁ 为配对友好曲线的生成元)
3. 计算 V = e(U, Q_B) × H₂(m) # 其中 Q_B 为 B 的公钥
4. 计算 W = [r]P_B # P_B 为 B 公钥对应的曲线点
5. 计算 s = r + H₃(U, V, W) × d_A # d_A 为 A 的私钥
6. 输出 σ = (U, V, W, s)验证方程:
e(s·G₁ + H₃(U,V,W)·P_A, P₂) == e(U, Q_B) × H₂(m)基于椭圆曲线的构造
实际工程中更多采用基于传统椭圆曲线的构造。Koblitz 和 Smart 提出了第一个非配对的签名加密方案,后续 Kim、Solinas 等研究者提出了兼容 SM2 曲线参数的 KSS 方案:
密钥生成:
- 私钥:d_A ∈ ℤ_n*
- 公钥:Q_A = [d_A]G
签名加密:
1. 选取随机 k ∈ ℤ_n*
2. 计算 R = [k]G
3. 计算 Z = [k]Q_B # 共享点,用于派生加密密钥
4. 派生会话密钥:K = KDF(Z || R)
5. 计算密文部分:C = E_K(m)
6. 计算签名部分:s = h(K || R || C) × d_A + k mod n
7. 输出签名加密文本 σ = (R, C, s)
签名验证:
1. 验证 s·G == R + h(K || R || C) × Q_A
2. 若等式成立,解密 C 得到 m注意:上述为概念性描述,实际参数和运算顺序需严格遵循标准定义。生产实现应参考 ISO/IEC 14888-3 或相关国密标准。
安全性模型
IND-SC-CPA 安全性
不可区分性-选择明文攻击安全定义为:
- 挑战者生成密钥对,泄露公钥
- 对手获取公钥后提交两等长消息 m₀, m₁
- 挑战者随机选取 b ∈ {0, 1},计算 σ* = Signcrypt(m_b)
- 对手获得 σ*,尝试区分 b
- 若对手优势可忽略,则方案安全
IND-SC-CCA 安全性
增强版安全性模型允许对手访问签名加密和解密预言机,挑战消息仍须满足不可查询条件。这是实际应用中的最低安全要求。
不可伪造性分析
签名加密需抵抗两类伪造:
- 外部伪造:非目标用户伪造他人签名加密文本
- 内部伪造:目标用户声称未发送某签名加密文本
国密适配
SM2 签名加密方案
国密 SM2 算法本身支持签名和加密两个独立功能,但未原生提供签名加密原语。实现方案包括:
- 基于 SM2 签名和 SM2 加密的耦合构造:共享随机数 k,消除冗余
- 基于 SM9 标识密码的签名加密:利用 SM9 的标识特性简化密钥管理
# 注意:以下代码仅为示意,生产环境需使用符合 ISO/IEC 14888 或 GM/T 标准的实现
from gmssl import sm2, func
# 密钥生成(简化)
private_key = 'your-sm2-private-key'
public_key = 'your-sm2-public-key'
message = b'confidential data'
# 签名加密需要自定义实现:
# 1. 生成随机数 k
# 2. 计算 R = [k]G
# 3. 计算共享点 Z = [k]Q_B
# 4. 派生会话密钥
# 5. 加密消息
# 6. 生成签名
# 完整流程参见 ISO/IEC 14888-3 或相关研究文献注意:生产环境需使用符合 ISO/IEC 14888 或 GM/T 标准的签名加密实现,而非简单拼接签名和密文。
标准化进展
目前国密体系中尚无专门的签名加密标准,相关研究多参考 ISO/IEC 14888-3 或 ANSI X9.52 标准。未来可能在 GM/T 系列标准中纳入签名加密规范。
应用场景
电子邮件安全
S/MIME v2.0 引入了 Signcryption 扩展,支持高效邮件认证和加密。
物联网通信
资源受限设备可利用签名加密减少计算负担,特别适合低功耗广域网场景。
区块链智能合约
签名加密可用于高效的多签钱包和身份验证,减少链上交易数据量。
相关实践
- SM2 数字签名算法深度解析 — 签名原语基础
- SM2 加密算法详解 — 加密原语基础
- 国密 TLS 协议详解 — 签名加密在实际协议中的应用
参考资料
- ISO/IEC 14888-3:2018 — Information technology — Security techniques — Digital signatures with appendix — Part 3: Signcryption mechanisms
- Anand M, Koblitz N. "Efficiency of signcryption." In Workshop on the Theory and Application of Cryptographic Techniques, EUROCRYPT 1996.
- Boneh D, Lundmark-Naor D. "Efficient schemes for bidirectional anonymous authenticated key exchange." International Journal of Information Security, 2004.
- Kim K, Solinas J, et al. "Signcryption using elliptic curves." IACR Cryptology ePrint Archive, 2005/016.