我正在寻找一种用于 C++ 程序的快速非对称密码算法。 我们的应用程序访问存储在存档中的只读数据(自定义格式,有点类似于 tar),我想通过非对称加密存档索引来防止对该存档进行任何修改(我知道这不是一个完美的解决方案并且仍然可以使用某些技术提取和重新打包数据)。
一些存档中的单个文件使用对称密码加密,并且它们的加密 key 存储在存档索引(标题)中。这就是为什么我想非对称地加密存档 header 。
密码要求:
1) 算法实现应该是平台无关的。
2) 算法应该很容易自己实现,或者它应该在允许静态与专有应用程序链接的库(带有源代码)中可用,这意味着不能使用 GPL/LGPL/病毒许可证。 MIT/BSD 许可代码,或公共(public)域代码是可以接受的。
3) 如果 cypher 在库中可用,理想情况下它应该有小的内存占用,并且实现应该是紧凑的。我更愿意使用仅实现一种密码的 C/C++ 库,而不是成熟的通用密码集合。
本来我想用RSA,但是看起来太慢了,没啥用,而且没有太多选择。
那么,关于我可以使用什么有什么建议吗?
最佳答案
好的,我找到了我一直在寻找的东西,而且我认为它比 OpenSSL 更好(至少对我来说是这样)。
有两个库:
libtomcrypt ,它实现了几个密码(包括 RSA),和 libtommath ,它实现了 bignum 算术。这两个库都在公共(public)领域,易于破解/修改,并且具有比 OpenSSL 更简单的编程接口(interface),并且比 OpenSSL(好得多)更好的文档。
Unlike older public domain rsa code I found before , libtomcrypt 可以非常快速地生成新 key ,可以导入 OpenSSL 生成的 key ,并且支持填充。 libtomcrypt 的另一个好处是它没有额外的依赖项(例如,OpenSSL for windows 需要 gdi32)并且比 OpenSSL 小。
毕竟,我决定使用 RSA 进行加密,因为(在我看来)没有真正的非对称替代方案。看起来大多数其他密码(elgamal,椭圆曲线)更适合对称加密,其中 session key 被非对称加密。哪个不适合我。此类密码适用于网络通信/ session key ,但不适用于磁盘上的静态不变数据。
至于“RSA 很慢”,我稍微改变了存档格式,所以现在只有一小块数据被非对称加密。未能解密此 block 将使读取存档索引完全变得非常困难,如果不是不可能的话。此外,我必须承认,RSA 的缓慢部分是 older code 给出的错误印象。我以前试过用。
也就是说,问题解决了。解决方案是 RSA + libtomcrypt。 RSA - 因为 RSA 和 libtomcrypt 的替代品不多 - 因为它很小并且在公共(public)领域。
关于c++ - 用于 C++ 应用程序的快速非对称密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2247697/