在哪里可以找到 C++ 中的 RSA PKCS#1 V2.1 实现?
我在这里找到了一个实现,但我不确定它是否符合该标准。
任何人还可以解释可能导致行动不一致的 RSA 算法的各种实现之间的主要区别吗?
2 回答
RSA 算法是一种可用于两个目的的原语:
- 机密性(即公钥加密),或
- 来源证明(即与密码散列结合时的数字签名)
PKCS#1 是现在大多数人都提到的基于 RSA 的加密和签名的标准。更具体地说,最新版本的 PKCS#1 (2.1) 定义了四种不同的方案:
- PKCS#1 v1.5 加密(仅用于遗留目的,任何人都不应再使用它)
- OAEP 加密(对于任何新的实施都是首选)
- PKCS#1 v1.5 签名
- PSS 签名
换句话说,当您说“ RSA PKCS#1 V2.1 ”时,您应该真正参考上述任何方案,因为库可以实现方案的子集。
PKCS#1 标准写得非常好,所以它的所有正确实现在定义上都是相互兼容的。由于除了第一个方案之外的所有方案都依赖于加密哈希,因此您还需要验证所选库是否包含您计划使用的库(例如 SHA-256)。
我强烈建议通过查看测试向量集(有多少以及它们来自哪里)来判断库的质量。
尽管如此,正确的实现并不一定是安全的。除了缓冲区溢出之类的普通事情之外,还应该验证该库是否考虑了所有针对 RSA 实现的最新攻击(至少包括对 RSA 的最实际的侧通道攻击)。这很难评估,但是 - 对于开源库 - 您可以通过查看社区的规模和活动以及他们是否在发现漏洞后立即发布漏洞来感受一下。
像Botan或Crypto++这样的开源 C++ 库是一个不错的选择。您可能只想检查它们在目标平台上是否足够快,它们的许可证(分别是 BSD 和公共领域)是否可接受,以及它们是否与您的平台兼容。
不要将学生软件库用于密码学。它们维护不善,可能会导致错误。请改用Crypto++等众所周知的加密框架。他们应该声称与标准兼容。您可以检查他们是否针对标准的参考测试向量进行测试;通常存在类似的东西。
如果库获得 FIPS 或通用标准批准(例如 OpenSSL 获得 FIPS 批准),则奖励加分。