【问题标题】:Asymmetric authenticated encryption非对称认证加密
【发布时间】:2012-11-11 18:11:23
【问题描述】:

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

【问题讨论】:

  • Authenticate-Then-Encrypt 往往会出现问题。我宁愿签署明文,然后使用经过身份验证的加密进行加密。
  • @CodesInChaos,这就是我最初想到的,但这不是我需要做的过度吗?
  • @owlstead 如果我错了,请纠正我。 RSA 使用公钥加密数据,因此,每个人都应该能够生成 AES 密钥,用 RSA 加密,执行 GCM 并将其发送给 Bob。 Bob 会认为这是来自 Alice 的有效消息,因为他可以解密密钥并将其与 GCM 一起使用来验证发送的消息。
  • 但是对于数据签名,RSA 使用私钥。这就是唱歌的想法的来源。

标签: c++ authentication encryption cryptography crypto++


【解决方案1】:

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

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

我还看到了一些不正确的 RSA 应用,其中 RSA 在 ECB 模式下运行。即数据被“分块”或“分块”,然后对每个块应用 RSA。 Handbook of Applied Cryptography 对此特别提出警告。

您可能会做的最好的事情是Elliptic Curve Integrated Encryption Scheme (ECIES)Discrete Log Integrated Encryption System (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。其次是唐戴维斯的Defective Sign & Encrypt in S/MIME, PKCS#7, MOSS, PEM, PGP, and XML

这里的相关性是:Krawczyk 的论文涉及对称密钥加密和经过验证的加密的 Encrypt-then-Authenticate 风格(以及如何执行经过验证的加密)。 Davis 的论文涉及非对称密码学以及签名和加密之间的脱节(以及如何修复它)。


但在我这样做之前,是否有任何加密库可以满足我的需求?

是的(但这取决于您想做什么)。 Crypto++ 是我所知道的唯一提供 ECIES、DLIES 和 PSSR 集合的软件。

Bouncy Castle 紧随其后,因为它提供 ECIES,但不提供 DLIES。我不确定它提供了多少 PSSR。

Crypto++、Bouncy Castle、OpenSSL(和其他)提供 PSSR。使用 PSSR 查找库应该不会有任何问题。

【讨论】:

  • 感谢您提供的信息,它们一定会派上用场以供以后使用。关于答案末尾的问题,我应该说,我对加密概念有点熟悉,但我肯定对它们没有接近适度的理解。所以我认为我问题的第一句话应该或多或少非正式地描述我的目标。
  • @atoMerz - 在这种情况下,为用户生成一个 EC 密钥对。使用 ECIES 在用户的公钥下加密文件。很难比那个方案更好。否则,请查看 Crypto++ wiki 上的 Authenticated Encryption。 AE 的缺点是您必须执行密钥管理。
【解决方案2】:

您可以考虑使用基于 OpenPGP 的解决方案。这将为您提供所需的功能,并且可以扩展以支持任意数据大小,这与纯粹基于非对称加密(没有传输密钥)的解决方案不同。

那里有一些开源实现。 BouncyCastle 提供了一个,但我不确定他们是否有 C++ 实现。

【讨论】:

  • 我只搜索了 BouncyCastle,但现在我注意到也有 C/C++ 实现,你能解释一下如何使用它来达到我的目的吗?
  • 我认为最好的方法是在阅读协议后简单地查看 CLI 应用程序如何执行加密和签名。
【解决方案3】:

GPGME(GnuPG 变得简单)。它是 C 语言的高级加密库,并获得 LGPL 许可。

【讨论】:

  • 是的,我已经找到了。知道我正在寻找的函数名称吗?
  • 感谢您的链接。但是我仍然不明白几点。您的链接显示encryp_sign,但实际页面仅讨论加密。其次,decrypt_verify 是如何工作的?我没有看到任何密钥传递给它。
  • 向下滚动,进一步查看 gpgme_op_encrypt_sign,您需要阅读 manual 的其余部分以了解所有信息
  • 谢谢,将 cmets 添加为您的答案的一部分将不胜感激。它也会帮助其他人。
猜你喜欢
  • 1970-01-01
  • 2011-04-05
  • 2019-07-29
  • 1970-01-01
  • 2011-11-17
  • 2010-10-30
  • 2017-02-22
  • 2011-03-01
  • 1970-01-01
相关资源
最近更新 更多