当前位置: 首页 > 知识库问答 >
问题:

没有IV的AES CTR-相同的密钥用于多个消息-安全?

诸葛文博
2023-03-14

我想在js中制作一个网页,将加密明文,所以我可以把它发送给朋友,谁将使用相同的网页来解密它。

我们将共享同一密钥,并将其用于多条消息。

我知道当使用AES CBC-有需要随机iv为每个消息,但我喜欢使用AES CTR。

我将使用256键,而不是密码。

我有两个问题:

  1. 我可以在CTR和no iv中多次使用同一密码吗
  2. 如果我将使用CBC,在发送加密消息的同时发送明文iv是否安全

我使用的是aes js和基本的通用操作模式

https://github.com/ricmoo/aes-js#ctr---反建议

https://github.com/ricmoo/aes-js#cbc---建议使用密码块链接

我想要最好的安全措施。

共有2个答案

井誉
2023-03-14
  1. 我可以在CTR和没有IV的情况下多次使用相同的密码吗?

不,在这种情况下,CTR将作为一个多时间垫,您将失去大部分而不是所有的安全性。

使用CBC也不安全,因为您可能成为oracle攻击的受害者。

使用带有12字节随机IV的GCM,或者更好地使用带有预共享密钥(PSK)的TLS。

董霖
2023-03-14

首先,没有像CTR或CBC这样带有“no IV”的东西。你可能只是使用全零作为IV。总有一个IV。(CTR称其IV为nonce。)

CTR绝对不能重复使用一个临时密钥对。它可以完全破坏加密。这是避免CTR的主要原因,除非你知道自己在做什么。它很难正确使用,并且具有可怕的故障模式。(WEP现在被认为完全崩溃的事实与这个问题密切相关。)我并不是说正确使用CTR是不好的;我是说小错误是灾难性的。

CBC永远不应该重复使用IV密钥,但它没有那么具有破坏性。这是CBC对于非专家来说是一个非常好的选择的一个主要原因。即使使用不当,它也相对安全。但是,重用IV密钥对会带来两个主要问题:

  • 将前16个字节公开解密,如果两个消息具有相同的前缀,还将公开其他块。
  • 加密相同的消息相同(和相同的前缀相同)。这间接泄露了有关消息的大量信息。

标准结构非常适合非专家,因为工具在许多平台上都很容易获得,并且相对容易正确使用,如下所示:

Random IV + CBC-ciphertext + HMAC

静脉注射不是秘密。随消息一起发送才是标准正确的。IV只能是攻击者无法预测的。只要攻击者不能预测(或控制)IV,即使偶尔的重用也不会泄露什么信息。显然,如果总是零,预测它是微不足道的。

CBC(以及CTR)不提供对消息的任何认证。它可以在运输途中被修改。如果攻击者知道明文消息,则在某些情况下,他们可以修改加密消息,以便以已知方式解密。例如,如果我知道(或能猜到)消息内容为To Bob: 100美元,则可以在不知道密码的情况下将该消息修改为To Eve: 100美元。身份验证可以防止这种情况。验证CBC的方法是使用HMAC(先加密,然后散列)。

有关此html" target="_blank">格式的实际示例,请参阅RNCryptor格式,包括RNCryptor js

Maarten提到GCM,我同意它是一个优秀的密码学,但我不同意非专家应该使用它。作为计数器模式,它与CTR具有相同的危险。如果使用不当,它将完全崩溃(与CBC相比,CBC的安全性损失要平稳得多)。然而,这是一个非常固执己见的话题,GCM的粉丝们并没有错。我只是不同意“非专家的标准最佳实践”应该是什么。

为了“我想要尽可能最好的安全”,那么你绝对需要安全专家的参与。选择正确的块模式是保护系统的最简单部分,还有许多其他陷阱也同样重要。

 类似资料:
  • 在一个多线程Java应用程序中,我们使用AES-256对磁盘上的文件进行加密和解密。请注意,多个线程可以对不同文件的加密和解密方法进行并发调用。 加密:

  • 我有一个外部应用程序生成的多个主题,这些主题共享相同的密钥,并且它们共享此模型: Topic1:使用unix ms时间戳作为键生成消息。 主题2:从主题1中读取并生成具有相同密钥的消息 Topic3:从Topic2读取并生成具有相同键的消息 等等 我的应用程序依赖于Topic3中的最终消息(它们在1-2ms内生成),但我也希望Topic1中的值。我创建了一个使用多个使用者的类,但我觉得它不是很有效

  • 文件。当前密钥、web API密钥和服务器密钥之间有什么区别,在哪里可以找到当前密钥FCM控制台?我找不到它。

  • 第二,客户端向服务器端发送公钥。 服务器生成对称AES密钥。 4T:服务器用他的AES密钥加密他想要发送给客户端的文本。

  • 我有一个输入流,我用它来创建一个KTABLE。然后使用toStream()方法,使用ktable changelog创建一个输出流。问题是toStream()方法创建的流不包含更新了KTABLE的输入流中的所有消息。下面是我的代码: 我想这是因为Ktable的更新是通过一些批处理操作进行的,但我找不到任何与之相关的配置或文档。是这些丢失事件的原因吗?你知道如何更改配置以便我不会丢失任何消息吗?

  • 我有一个主应用程序将消息发送到SQS队列,希望4个消费者应用程序使用相同的消息,并按自己的意愿进行处理 我不确定用于此目的的队列体系结构。 我看到标准SQS、SQS FIFO、(SQS SNSTopic)的选项 对于我想要的功能,似乎(SQS SNS主题)或Kenesis将是一条可行的道路。 但是我也有一个关于标准SQS的问题 我想我是混淆之间的所有选项和压倒了所有的信息可用的队列但仍然感到困惑哪