我正在寻找一种用于C ++程序的快速非对称密码算法。 我们的应用程序访问存档中存储的只读数据(自定义格式,有点类似于tar),我想通过非对称加密存档索引来阻止对该存档的任何修改(我知道这不是一个完美的解决方案,仍然可以使用某些技术提取和重新打包数据)。
归档中的某些单个文件使用对称密码进行加密,并且加密密钥存储在归档索引(标头)中。这就是我想要非对称地加密归档头的原因。
Cypher要求:
1)算法实现应该是平台无关的
2)算法应该易于实现,或者应该在库(带有源代码)中提供,允许静态链接到专有应用程序,这意味着不能使用GPL / LGPL /病毒许可证。 MIT / BSD许可代码或公共域代码是可以接受的
3)如果库中有cypher,理想情况下它应该具有较小的内存占用,并且实现应该紧凑。我更喜欢使用只实现一个密码而不是完整的通用密码集的C / C ++库。
最初我想使用RSA,但看起来它太慢而无法使用,并且没有太多替代品。
那么,关于我可以使用什么的任何建议?
答案 0 :(得分:4)
好的,我已经找到了我一直在寻找的东西,我认为它比OpenSSL更好(至少在我的目的)。
有两个图书馆:
libtomcrypt实现了bignum算法,它实现了几个密码(包括RSA)和libtommath。这两个库都在公共领域,易于破解/修改,并且具有比OpenSSL更简单的编程接口,以及(更多)比OpenSSL更好的文档。
Unlike older public domain rsa code I found before,libtomcrypt可以非常快速地生成新密钥,可以导入OpenSSL生成的密钥,并支持填充。关于libtomcrypt的另一个好处是它没有额外的依赖(例如,Windows的OpenSSL需要gdi32),并且比OpenSSL小。
毕竟,我决定使用RSA进行加密,因为(对我来说看起来像),没有真正的非对称替代品。看起来大多数其他密码(elgamal,椭圆曲线)更适合于对称加密,其中会话密钥是非对称加密的。哪个不适合我。这种密码适用于网络通信/会话密钥,但将它用于磁盘上静态不变的数据并不好。
至于“RSA很慢”,我稍微更改了存档格式,所以现在只有少量数据被非对称加密。如果不是不可能的话,未能解密这个块将使读取归档索引变得非常困难。此外,我必须承认,RSA的缓慢部分是由我之前尝试使用的older code给出的错误印象。
这意味着,问题解决了。解决方案是RSA + libtomcrypt。 RSA - 因为没有很多RSA和libtomcrypt的替代品 - 因为它很小并且在公共领域。
答案 1 :(得分:2)
OpenSSL应该为您完成这项工作。它是开源的(apache许可证,因此符合您的许可证要求)。
它被广泛使用并经过充分测试。
答案 2 :(得分:2)
使用自定义RSA对存档进行签名。将公钥存储在应用程序中并将私钥保留在内部。现在任何人都可以修改只读存档,但您的应用程序将拒绝加载修改后的存档。
答案 3 :(得分:2)
查看Curve25519,这是有效实施的椭圆曲线密码学,以及专利问题。
它符合您的所有要求。 See Here
您可以使用它来加密或简单地签名。
对于完整性检查,MAC应该足够,除非你真的需要不对称加密。
答案 4 :(得分:1)
MD5怎么样?
是的我知道MD5已被打破; - 但大多数实际应用都无关紧要 特别是如果修改后的数据也必须在特定数据格式中有效并且具有正确的MD5
编辑:
如果您只想确保无法更改存储的数据(或者至少可以检测到它),MD5是合适的,但它不会隐藏数据。请注意,如果您的应用中的密钥必须与数据一起提供,则始终可以提取该密钥。有一些隐藏密钥的技术 - 一种流行的方法就是将其放在静态资源中,例如可以轻松链接的图标。