我想保护我的数据不被未经授权的人更改或读取。环顾四周,我发现 Authenticated Encryption(AE) 是一种解决方案。
我知道我可以使用 CCM、GCM 或 EAX 中的任何一个在 Crypto++ 中进行 AE。但我注意到他们使用相同的密钥来加密和解密数据。我不希望这样,我宁愿使用非对称密钥来加密和解密我的数据。
如果我使用非对称算法对数据进行签名,然后使用对称算法对其进行加密,我将实现我想要的(这应该是安全的,因为它是AtE方法,对吧?)。
但在我这样做之前,是否有任何加密库可以满足我的需求?
3 回答
我知道我可以使用... CCM、GCM 或 EAX 进行身份验证加密。但我注意到他们使用相同的密钥来加密和解密数据。我不希望这样,我宁愿使用非对称密钥来加密和解密我的数据。
我知道的所有方案都将使用对称密码进行批量数据加密。对称密码可以是分组密码或流密码。
我还看到了一些不正确的 RSA 应用,其中 RSA 在 ECB 模式下运行。即数据被“分块”或“分块”,然后对每个块应用 RSA。《应用密码学手册》特别警告了这一点。
您可能要做的最好的事情是椭圆曲线集成加密方案 (ECIES)或离散日志集成加密系统 (DLIES)。两者都在 Crypto++ 中可用。两者都使用公钥(非对称)加密。
ECIES 和 DLIES 将密钥封装机制 (KEM) 与数据封装机制 (DEM) 结合在一起。系统从公共秘密中独立地导出对称密码密钥和 MAC 密钥。数据首先在对称密码下加密,然后密文在身份验证方案下进行 MAC'd。最后,公共秘密在公钥/私钥对的公共部分进行加密。加密函数的输出是元组{K,C,T}
,其中K
是加密后的公共秘密,C
是密文,T
是认证标签。
围绕“公共秘密”有一些人放弃,因为它实际上是应用密钥协议功能的结果,后来用 KDF 消化。它使用静态公钥和临时密钥对。执行解密的人使用他们的公钥来执行另一半的密钥交换以得到“公共秘密”。
KEM 和 DEM 避免填充,因此填充预言不是问题。这就是为什么使用 KDF 来消化 KEM 下的大型“公共秘密”。省略填充极大地简化了系统的安全证明。由于安全证明,ECIES 和 DLIES 是IND-CCA2,这是您可以实现的最强之一。
如果我使用非对称算法对数据进行签名,然后使用对称算法对其进行加密......
这是一些相关的阅读……首先是 Hugo Krawczyk 的The Order of Encryption and Authentication for Protecting Communications。其次是 Don Davis在 S/MIME、PKCS#7、MOSS、PEM、PGP 和 XML 中的缺陷签名和加密。
这里的相关性是:Krawczyk 的论文涉及对称密钥加密和认证加密的 Encrypt-then-Authenticate 风格(以及如何执行认证加密)。Davis 的论文涉及非对称密码学以及签名和加密之间的脱节(以及如何修复它)。
但在我这样做之前,是否有任何加密库可以满足我的需求?
是的(但这取决于你想做什么)。Crypto++ 是我所知道的唯一提供 ECIES、DLIES 和 PSSR 集合的软件。
Bouncy Castle 紧随其后,因为它提供 ECIES,但不提供 DLIES。我不确定它提供了多少 PSSR。
Crypto++、Bouncy Castle、OpenSSL(和其他)提供 PSSR。使用 PSSR 查找库应该没有任何问题。
GPGME(GnuPG 变得简单)。它是 C 语言的高级加密库,并获得 LGPL 许可。
您可以考虑使用基于 OpenPGP 的解决方案。这将为您提供您想要的功能,并且可以扩展以支持任意数据大小,这与纯粹基于非对称加密(没有传输密钥)的解决方案不同。
那里有一些开源实现。BouncyCastle 提供了一个,但我不确定他们是否有 C++ 实现。