【问题标题】:CryptoStream and Authenticated Encryption ModesCryptoStream 和 Authenticated 加密模式
【发布时间】:2014-09-23 02:58:34
【问题描述】:

我有兴趣提供一个在 .Net 中使用的托管 dll,该 dll 提供经过身份验证的加密服务。 DLL 可能在 WPF 程序或 ASP 应用程序中使用。我有几个与 Microsoft 的加密和流模型有关的问题。

经过身份验证的加密模式(CCM、CWC、EAX、GCM 等)通常会产生两个工件 - 第一个是密文,第二个是身份验证标签。流式加密相当容易,但可能存在一些问题。例如,由于标头的构建方式和经过身份验证的加密模式会产生身份验证标签,CCM 无法流式传输。

解密比较棘手,因为它无法流式传输。无法流式传输解密,因为所有密文都必须可用,并且密文必须在解密之前使用身份验证标签进行验证。

如何为分组密码调整一种经过身份验证的加密模式,以便它可以在CryptoStream 中使用?甚至可能吗?也许是微软不提供它的原因?

微软有推荐吗?例如,将大消息分解成更小的消息或单元(每个都有自己的标签)?还是 MS 建议在输入整个消息和标签之前进行缓冲?

Microsoft 建议在哪里“放置”标签?在流的开头?在直播结束时?

一些有用的参考资料:

【问题讨论】:

    标签: .net cryptography


    【解决方案1】:

    2010 年,Microsoft CLR 安全团队发布了一个 extension to the System.Security.Cryptography,其中包括经过身份验证的对称加密,特别是 GCM。为什么他们从那以后没有做任何事情,我不知道。

    但是,既然你的问题强调“微软会做什么?”,那就是……他们这样做了。

    【讨论】:

    • 我已经看到 GCM 被用于 XML 加密和最新的 TSL 草案规范。将 GCM 添加为经过身份验证的加密非常有意义。 CCM 也是安全的,但它是一个使用和实施的 PITA。
    • @owlstead - “CCM 也是安全的,但它是一个使用和实施的 PITA。”大声笑.... +1。我只是在读一本安全工程书籍,它谈到了 CCM 采用的历史和政治。我希望我能记得那是什么书.....
    【解决方案2】:

    您使用的假设并不真正适用于 GCM 等流密码上的经过身份验证的加密:您无法在验证之前解密。这是真的,例如CBC 模式下的 AES 在应用填充预言时由 MAC 进行身份验证。例如,GCM 模式不执行填充,因为底层流密码是 CTR 模式加密。这反过来意味着不必应用填充,因此填充预言不适用。

    当然,在解密数据未通过身份验证之前对其执行任何业务逻辑是极其不明智的。任何涉及未经验证数据的代码都应该被认为是高风险的,并且应该进行静态分析和审计。如果您想更早地执行任何业务逻辑,那么您确实应该确保在这样做之前对其进行身份验证。把它分成更小的部分当然是有意义的。

    显然,这些只是我的建议。对于 Microsoft 的建议:如果无法使用 Google 或(上帝保佑)Bing 找到它们:询问 Microsoft。这里没有人可以为他们说话。

    【讨论】:

    • 感谢 owlstead,我的立场已得到纠正。我实际上不同意您所说的,但 GCM 标准允许这样做。 (对于其他人:A High-Throughput Authenticated Encryption Mode,第 2 页)。话虽如此,在我的职权范围内没有任何代码实践验证前使用范例。如果我想要那种鲁莽,我可以切换到 SSH 或 SSL/TLS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2013-09-06
    相关资源
    最近更新 更多