2

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

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

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

最初我想使用 RSA,但它看起来太慢而无法使用,并且没有太多替代方案。

那么,关于我可以使用什么的任何建议?

4

5 回答 5

4

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

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

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

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

这意味着,问题解决了。解决方案是 RSA + libtomcrypt。RSA - 因为 RSA 和 libtomcrypt 的替代品不多 - 因为它很小且属于公共领域。

于 2010-02-18T03:21:34.043 回答
2

OpenSSL 应该为您完成这项工作。它是开源的(apache 许可证,因此符合您的许可证要求)。

它被广泛使用并经过良好测试。

于 2010-02-11T21:08:46.183 回答
2

查看 Curve25519,它是有效实施的椭圆曲线密码学,并解决了专利问题。

它满足您的所有要求。见这里

您可以使用它来加密或简单地签名。

作为旁注:

对于完整性检查,除非您确实需要非对称加密,否则 MAC 就足够了。

于 2010-02-11T21:30:21.863 回答
2

使用自定义 RSA 对存档进行签名。将公钥存储在应用程序中,并将私钥保存在内部。现在任何人都可以修改只读存档,但您的应用程序将拒绝加载修改后的存档。

于 2010-02-11T21:17:29.103 回答
1

MD5怎么样?

是的,我知道 MD5 已“损坏”;- 但在大多数实际应用中,这无关紧要。
特别是如果修改后的数据还必须在特定数据格式中有效并且具有正确的 MD5

编辑:
如果您只想确保无法更改存储的数据(或者至少您可以检测到它)但它不会隐藏数据,则 MD5 是合适的。请注意,如果您的应用程序中必须有密钥以及数据,则始终可以提取它。有一些隐藏密钥的技术 - 一种流行的技术是将其简单地放在静态资源中,例如可以轻松链接的图标。

于 2010-02-11T21:24:12.967 回答