非对称认证加密

ato*_*erz 5 c++ authentication encryption cryptography crypto++

我想保护我的数据不被未经授权的人更改或读取。环顾四周,我发现 Authenticated Encryption(AE) 是一个解决方案。
我知道我可以使用 CCM、GCM 或 EAX 中的任何一个在 Crypto++ 中进行 AE。但我注意到他们使用相同的密钥来加密和解密数据。我不想那样,我宁愿使用非对称密钥来加密和解密我的数据。
如果我使用非对称算法对数据进行签名,然后使用对称算法对其进行加密,我将实现我想要的(这应该是安全的,因为它是AtE方法,对吧?)。
但在我这样做之前,是否有任何加密库可以满足我的需求?

jww*_*jww 5

我知道我可以使用 ... CCM、GCM 或 EAX 进行身份验证加密。但我注意到他们使用相同的密钥来加密和解密数据。我不想那样,我宁愿使用非对称密钥来加密和解密我的数据。

我知道的所有方案都将使用对称密码进行批量数据加密。对称密码可以是分组密码或流密码。

我还看到了一些不正确的 RSA 应用,其中 RSA 在 ECB 模式下运行。即对数据进行“分块”或“分块”,然后对每个块应用RSA。《应用密码学手册》特别警告了这一点。

您可能要做的最好的是椭圆曲线集成加密方案 (ECIES)离散日志集成加密系统 (DLIES)。两者都在 Crypto++ 中可用。两者都使用公钥(非对称)加密。

ECIES 和 DLIES 将密钥封装机制 (KEM) 与数据封装机制 (DEM) 结合在一起。系统从公共秘密中独立导出对称密码密钥和 MAC 密钥。数据首先在对称密码下加密,然后在身份验证方案下对密文进行 MAC 处理。最后,公共秘密在公钥/私钥对的公共部分下加密。加密函数的输出是元组{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 查找库应该不会有任何问题。