当前位置: 首页 > 面试题库 >

CTR模式使用初始向量(IV)

佴淮晨
2023-03-14
问题内容

据我所知,点击率模式不使用初始向量。它只需要一个计数器,用给定的密钥对其进行加密,然后将结果与明文进行XOR运算以得到密文。

其他分组密码模式(例如CBC)在进行加密之前,会将明文与初始向量进行异或。

所以这是我的问题。我在Java中有以下代码(使用bouncycastle库):

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] result = cipher.doFinal("Some plaintext");

使用相同的键对上述代码进行的每个不同调用都会产生不同的输出!但是在做的时候:

byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC");

cipher.init(Cipher.ENCRYPT_MODE, key, IV);

byte[] result = cipher.doFinal("Some plaintext");

在上述代码的每次调用中,我都会得到相同的结果。但是为什么呢?我的意思是,点击率不需要IV,那么为什么当我在每次通话中都不给出IV时却得到不同的结果,而当我给出IV时它返回相同的结果呢?如果我在使用点击率时总是使用上述IV(全零),那会安全吗?

任何想法都将非常有帮助。谢谢


问题答案:

最重要的 与CTR模式需要注意的是,你 永远不会 使用相同的密钥重新使用相同的计数器值。如果这样做,您实际上已经放弃了纯文本。

为了解决这个问题,在CTR模式的一些实际实现中,将传递给块密码的块分为两部分,分别标记为IV和计数器(而不是将整个对象称为计数器)。IV是随机生成的,并且计数器从0开始。

只要您从不重复使用“ IV”部分,就可以从零开始将“计数器”部分用于多个消息。

请注意,尽管这只是一个标签约定。从数学上讲,这与将整个事物称为“计数器”相同,并且对于每条消息,计数器以某个整数的随机倍数启动。

我不确定Bouncy Castle实施具体如何工作-
也许是让您使用该IV值设置整个初始块,计数器以及全部。如果不提供一个,显然会为您生成一个明智的IV,这就是为什么在相同输入下获得不同输出的原因。最重要的是,这是
好的 ,而正是您想要的-提供全零是 不好的 ,而不是您想要的。



 类似资料:
  • 问题内容: 当我运行此代码时: 但是我得到警告 所以我去看了看文档,但是“没有文档”。但仍然没有提到初始化向量是什么以及如何使用它。谁能启发我? 我知道我可以做更多的Google搜索工作,但是在众多搜索结果中排在首位,我认为这个问题对其他遇到此问题的人可能很有用。 问题答案: IV通常是一个随机数,可确保加密文本是唯一的。 为了解释为什么需要它,让我们假设我们有一个用密钥“秘密”而不用IV加密的人

  • 我是一个绝对的初学者,有以下任务我需要完成,但我完全困惑,无法在网上找到任何东西,希望有人能帮助我。 任务: 将变量“pattern”声明为一个32位的整数,并用位模式0011 1101 0101 1110 0101 1111 0001 1010(3D5E 5F1A)初始化。打印变量,将位7设置为1,然后再次打印。 鉴于: 当我理解正确时,默认情况下整数是用32位声明的,所以这部分对我来说没有什么

  • 我假设使用以下元素按以下顺序构建一个字节数组: 对称加密的AES密钥(对于AES 128有一个随机密钥,对于AES 128有一个随机初始化向量。在CBC模式下使用AES 128和PKCS5填充进行加密。在加密之前,文本用UTF-8进行编码) AES IV 加密消息(使用ECB模式下的RSA算法和PKCS1填充、先前生成的密钥和消息收件人的公钥) 我正在做的是获取每个参数的长度,以便创建新的byte

  • 延迟初始化 是一种允许我们延迟初始化消耗资源比较大的进程,直到需要他们的时候(才初始化)。这其中的一个例子就是jQuery的.ready()方法,它在DOM节点加载完毕之后会执行一个回调方法。 $( document ).ready( function () { //ajax请求不会执行,直到DOM加载完成 var jqxhr = $.ajax({ url: "ht

  • 我创建了一个示例容器,它在内部存储在std::vector中。我希望能够用std::vector初始化容器。因此,我创建了一个构造函数,它采用std::initializer_list,还采用begin和end。 但我似乎不能这样初始化: 这里的问题是什么?我该怎么修复? 代码在这里:

  • 我正在运行一个简单的代码来在hdfs上创建一个文件,并向其写入内容,然后关闭该文件。我可以在本地模式和纱线客户端模式下运行此代码。但是,当我用yarn-cluster模式运行相同的代码时,我在初始化sparkcontext时会遇到