返回列表
RSA加密填充与安全注意事项
自由客七维 2026-03-26 21:43 36

为什么需要填充?

RSA加密的原始运算c ≡ m^e (mod n)直接使用会带来多种安全问题:

  • 确定性加密:相同明文产生相同密文,泄露信息。
  • 小指数攻击:若e较小且m也小,可能m^e < n,密文可开e次方直接得到m。
  • 适应性选择密文攻击:攻击者可通过询问解密预言机破解。

因此,实际使用必须添加随机填充方案。

常见填充方案

1. PKCS#1 v1.5 填充

旧标准,格式为:0x00 || 0x02 || 随机非零字节 || 0x00 || 数据。优点是简单,但存在Bleichenbacher攻击等风险,目前已不推荐用于新系统。

2. OAEP(最优非对称加密填充)

现代推荐方案,使用MGF1掩码生成函数,提供更强的安全性证明。OAEP可抵抗选择密文攻击,已成为RSA加密标准(RFC 8017)。

签名填充

对于签名,通常使用PSS(概率签名方案)或PKCS#1 v1.5签名填充。PSS提供可证明安全性,推荐使用。

实际使用建议

  • 加密:使用OAEP填充,避免使用PKCS#1 v1.5。
  • 签名:优先使用PSS,并配合SHA-256以上哈希算法。
  • 库函数:使用OpenSSL的`RSA_public_encrypt`时选择`RSA_PKCS1_OAEP_PADDING`;使用`openssl_sign`时默认使用PKCS#1 v1.5,若需PSS需额外设置。

常见安全漏洞

  • 未使用填充直接加密。
  • 忽略填充检查导致padding oracle攻击。
  • 使用已弃用的PKCS#1 v1.5加密。
  • 签名时使用弱哈希(如MD5、SHA-1)。

正确的填充方案是RSA安全应用的关键,开发者应使用标准库提供的高层接口,避免自行实现。