用于 C++ 应用程序的快速非对称密码

Sig*_*erm 3 c++ encryption encryption-asymmetric

我正在寻找一种在 C++ 程序中使用的快速非对称密码算法。我们的应用程序访问存储在存档中的只读数据(自定义格式,有点类似于 tar),我想通过非对称加密存档索引来防止对该存档进行任何修改(我知道这不是一个完美的解决方案,并且仍然可以使用某些技术提取和重新打包数据)。

存档中的一些单个文件使用对称密码进行加密,并且它们的加密密钥存储在存档索引(标头)中。这就是为什么我想对存档头进行非对称加密。

Cypher 要求:
1)算法实现应该是平台无关的。
2) 算法应该易于自己实现,或者应该在允许与专有应用程序静态链接的库(带有源代码)中提供,这意味着不能使用 GPL/LGPL/病毒许可证。MIT/BSD 许可的代码或公共域代码是可接受的。
3)如果库中提供了 cypher,理想情况下它应该具有较小的内存占用,并且实现应该是紧凑的。我更愿意使用仅实现一种密码的 C/C++ 库,而不是成熟的通用密码集合。

本来我想使用RSA,但看起来它太慢了,没有什么用处,而且没有太多替代方案。

那么,对于我可以使用什么有什么建议吗?

Sig*_*erm 5

好的,我已经找到了我一直在寻找的东西,并且我认为它比 OpenSSL 更好(至少对于我的目的而言)。

有两个库:
libtomcrypt,它实现了多种密码(包括 RSA),而libtommath,它实现了 bignum 算术。这两个库都属于公共领域,易于破解/修改,并且具有比 OpenSSL 更简单的编程接口,以及比 OpenSSL 更好的文档。
与我之前发现的旧公共域 rsa 代码不同,libtomcrypt 可以非常快速地生成新密钥,可以导入 OpenSSL 生成的密钥,并支持填充。libtomcrypt 的另一个好处是它没有额外的依赖项(例如,Windows 版的 OpenSSL 需要 gdi32)并且比 OpenSSL 小。

毕竟,我决定使用 RSA 进行加密,因为(对我来说)没有真正的非对称替代方案。看起来大多数其他密码(elgamal、椭圆曲线)更适合对称加密,其中会话密钥被非对称加密。这不适合我。此类密码适用于网络通信/会话密钥,但将其用于磁盘上静态不变的数据并不好。

至于“RSA 速度慢”,我稍微改变了存档格式,所以现在只有一小部分数据被非对称加密。无法解密该块将使得完全读取存档索引变得非常困难(如果不是不可能的话)。另外,我必须承认 RSA 的缓慢部分是我之前尝试使用的旧代码给人的错误印象。

这意味着,问题解决了。解决方案是RSA + libtomcrypt。RSA - 因为 RSA 没有太多替代品,而 libtomcrypt - 因为它很小并且在公共领域。