AES-CTR加密模式介绍 例题

news2024/11/18 21:52:01

文章目录

    • CTR(Counter mode,CTR)计数器模式
    • 题目一
      • 题目描述:
      • 题目分析:
    • 浅记一下

CTR(Counter mode,CTR)计数器模式

原理: CTR将块密码变为流密码。它通过递增一个加密计数器以产生连续的密钥流,其中,计数器可以是任意保证长时间不产生重复输出的函数。AES是一种分组加密模式,其中CTR(计数模式)是其中一种工作模式。

加密原理:用密钥对输入的计数器加密,然后同明文异或得到密文。
解密原理:用密钥对输入计数器加密,然后同密文异或得到明文。
⋆ ⋆ ⋆ 从图中可以看出对计数器的加密 ( 即从 C o u n t e r ⇒ K 1 的过程 ) 采用的是 A E S − E C B 加密模式 \star\star\star 从图中可以看出对计数器的加密(即从Counter\Rightarrow K1的过程)采用的是AES-ECB加密模式 从图中可以看出对计数器的加密(即从CounterK1的过程)采用的是AESECB加密模式

♠ C T R 模式不需要 p a d d i n g ,故其加密后的密文长度是可知的 \spadesuit CTR模式不需要padding,故其加密后的密文长度是可知的 CTR模式不需要padding,故其加密后的密文长度是可知的
♠ 从图中可以看出对计数器的加密 ( 即从 C o u n t e r ⇒ K 1 的过程 ) 采用的是 A E S − E C B 加密模式 \spadesuit 从图中可以看出对计数器的加密(即从Counter\Rightarrow K1的过程)采用的是AES-ECB加密模式 从图中可以看出对计数器的加密(即从CounterK1的过程)采用的是AESECB加密模式
在这里插入图片描述
举个生成的例子来理解

ctr = Counter.new(AES.block_size * 8, initial_value=initial_value)
aes = AES.new(key, counter=ctr, mode=AES.MODE_CTR)
enc = aes.encrypt(msg)
  • AES.block_size 用于表示 AES 算法的分组大小(以字节为单位)的常量值。
  • AES 算法支持三种分组大小:16 字节(128 bits)、24 字节(192 bits)和 32 字节(bits 位)。分组大小的选择取决于所使用的 AES 密钥长度
  • 无指定情况下AES.block_size 的值为 16,表示使用 128 bits的分组大小
  • initial_value用于表示计数器的初始值,每使用一次,计数器值加1,确保每次不一样,从而不易被攻击,例如:

initial_value:b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08’
Counter value1: b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08’
Counter value2: b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\t’
Counter value3: b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\n’
Counter value4: b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x0b’
Counter value5: b’\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x0c’

以此类推,每次加1(转为long型加1,再转为bytes型)

题目一

题目描述:

from Crypto.Util.number import *
from Crypto.Cipher import AES
from Crypto.Util import Counter
from hashlib import sha256
from secret import flag

import os


def padding(msg):
    return msg + os.urandom(16 - len(msg) % 16)


msg = b"where is the flag? Key in my Heart/Counter!!!!"
key = b"I w0nder how????"

assert len(msg) == 46
assert len(key) == 16

enc_key = os.urandom(16)
initial_value = bytes_to_long(enc_key)
hash = sha256(str(initial_value).encode()).hexdigest()

aes = AES.new(enc_key, AES.MODE_ECB)
enc_flag = aes.encrypt(padding(flag))

ctr = Counter.new(AES.block_size * 8, initial_value=initial_value)
aes = AES.new(key, counter=ctr, mode=AES.MODE_CTR)
enc = aes.encrypt(msg)

print("enc = {}".format(enc[-16:]))
print("enc_flag = {}".format(enc_flag))
print("hash = {}".format(hash))

'''
enc = b'\xbe\x9bd\xc6\xd4=\x8c\xe4\x95bi\xbc\xe01\x0e\xb8'
enc_flag = b'\xb2\x97\x83\x1dB\x13\x9b\xc2\x97\x9a\xa6+M\x19\xd74\xd2-\xc0\xb6\xba\xe8ZE\x0b:\x14\xed\xec!\xa1\x92\xdfZ\xb0\xbd\xb4M\xb1\x14\xea\xd8\xee\xbf\x83\x16g\xfa'
hash = efb07225b3f1993113e104757210261083c79de50f577b3f0564368ee7b25eeb
'''

题目分析:

在这里插入图片描述
由流程可知,明文msg和密文enc_flag已知,那么两者异或就能得到K3(分三组:16 16 14,不需填充)
但此K3非彼K3,此K3是14字节,实际上K3是16字节,所以要得到真正的K3得进行填充
注意这里是往后填充,不是往前填充
(从流程图确实很容易想到是往前填充。但此处是CRT库里面的自己实现的,类似于规定一样,测试出来的数据确实也表明是往后填充,我想这应该也就是所说的 C T R 模式不需要 p a d d i n g CTR模式不需要padding CTR模式不需要padding的原因吧)
在末尾爆破两字节得到真正的K3,然后-2即可得到初始Counter,即initial_value
initial_value出来了,那么flag差不多也就出来了

from Crypto.Util.number import *
from Crypto.Cipher import AES
from Crypto.Util import Counter
from hashlib import sha256

msg = b"where is the flag? Key in my Heart/Counter!!!!"
key = b"I w0nder how????"
enc = b'\xbe\x9bd\xc6\xd4=\x8c\xe4\x95bi\xbc\xe01\x0e\xb8'
enc_flag = b'\xb2\x97\x83\x1dB\x13\x9b\xc2\x97\x9a\xa6+M\x19\xd74\xd2-\xc0\xb6\xba\xe8ZE\x0b:\x14\xed\xec!\xa1\x92\xdfZ\xb0\xbd\xb4M\xb1\x14\xea\xd8\xee\xbf\x83\x16g\xfa'
hash = 'efb07225b3f1993113e104757210261083c79de50f577b3f0564368ee7b25eeb'

a = msg[32:]
b = enc[2:]
enc_Counter1 = bytes(a[i] ^ b[i] for i in range(14))
for i in range(256):
    for j in range(256):
        enc_Counter2 = enc_Counter1 + bytes([i]) + bytes([j])
        aes = AES.new(key,AES.MODE_ECB)
        Counter = aes.decrypt(enc_Counter2)
        initial_value = bytes_to_long(Counter) - 2
        if hash == sha256(str(initial_value).encode()).hexdigest():
            enc_key = long_to_bytes(initial_value)
            aes = AES.new(enc_key,AES.MODE_ECB)
            flag = aes.decrypt(enc_flag)
            print(flag)
            break
# flag{9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d}

浅记一下

学到了AES-CTR加密模式,往后填充哪里确实需要我们记住
还有,当时看了很多资料,发现大家都是这样说的(引用一下):

计数器的生成方法

每次加密时都会生成一个不同的值(nonce)来作为计数器的初始值。当分组长度为128比特(16字节)时,计数器的初始值可能是像下面这样的形式
在这里插入图片描述
其中前8个字节为nonce(随机数),这个值在每次加密时必须都是不同的,后8个字节为分组序号,这个部分是会逐次累加的。在加密的过程中,计数器的值会产生如下变化:在这里插入图片描述

这应该是初始值只有8字节的时候吧
如果初始值就是16字节,那Counter value1的值就是初始值,之后的Counter value便是每次在初始值后加1,也就没有所谓的后8字节为分组序号组这一说法,就像上面讲原理是所介绍的那个例子。我理解的大致是这样,因为遇到的题目确实是按这个想法才能解。
学艺不精,还有待提升,继续加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/791432.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

防御第三天

1.总结当堂NAT与双机热备原理&#xff0c;形成思维导图 2.完成课堂NAT与双机热备实验 fw1: <USG6000V1>sy [USG6000V1]int g0/0/0 [USG6000V1-GigabitEthernet0/0/0]ip add 192.168.18.2 24 [USG6000V1-GigabitEthernet0/0/0]service-manage all permit (地址无所谓&…

NVM下安装NPM、CNPM详解与坑不是内部命令

设置npm的全局安装路径&#xff1a;有了可以不设置 npm config set prefix "H:\A-work\nvm\npm"C盘用户文件夹&#xff08;C:\Users[name]&#xff09;下会生成一个.npmrc的文件&#xff0c;用记事本打开后可以看到如下内容&#xff1a; 配置环境变量&#xff08;重…

Sip IP网络对讲广播模块,sip网络寻呼话筒音频模块

Sip IP网络对讲广播模块&#xff0c;sip网络寻呼话筒音频模块 模块介绍 SV-2401VP和SV-2403VPIP网络对讲广播模块是一款通用的独立SIP音频功能模块&#xff0c;可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 该模块支持多种网络协议和音频编…

AdaBoost的求解流程

对于任意Boosting算法&#xff0c;都需要明确以下几点&#xff1a; ① 损失函数&#x1d43f;(&#x1d465;,&#x1d466;)的表达式是什么&#xff1f;损失函数如何影响模型构建&#xff1f; ② 弱评估器&#x1d453;(&#x1d465;)是什么&#xff0c;当下boosting算法使用…

这是一个小程序求助帖

求助帖 请问各位大佬们&#xff0c;在vscode中运行android模拟器&#xff0c;报错&#xff1a;执行emulator命令失败, 错误信息&#xff1a;Error: spawn C:\WINDOWS\system32\cmd.exe ENOENT 该如何解决。环境变量什么的我都已经配置过了&#xff0c;电脑也重启过了&#xff…

Rman配置参数详解

using target database control file instead of recovery catalog指的是使用目标数据库控制文件代替恢复目录 1、CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default 设置rman备份过期条件&#xff1a;是用来决定那些备份不再需要了&#xff0c;它一共有三种可选项&…

mybatisPlus之自动填充功能及防全表更新与删除插件

自动填充功能 基本介绍 Mybatis-plus自动填充功能是指在数据库表进行增、删、改、查操作时&#xff0c;自动将某些字段的值进行填充。这些字段的值可以是当前时间、登录用户ID等。 在项目中有一些属性&#xff0c;如果我们不希望每次都填充的话&#xff0c;我们可以设置为自…

Cilium系列-5-Cilium替换KubeProxy

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…

数字身份、分布式存储、跨链技术等将如何推动Web3数据的发展?

Web3数据是基于区块链技术、去中心化、可信任的数据&#xff0c;具有较高的安全性和可信度。随着Web3.0时代的到来&#xff0c;Web3数据将会在金融、物联网、医疗、教育、政务等领域发挥重要的作用。其中&#xff0c;数字身份、分布式存储、跨链技术等将会是Web3数据发展的重要…

【教学类-34-07】20230726拼图(彩色图片+菱形凹凸拼图)3*4格子(中班主题《个别化拼图》偏美术)

作品展示&#xff1a; 背景需求 我尝试将拼图的“圆形凹凸角”变成"正方形凹凸角”&#xff0c;没有成功&#xff0c;但做出了“菱形凹凸角”。 实用性思考&#xff1a; 1、这种菱形凹凸角与正方形结构近似&#xff0c;裁剪难度中等&#xff08;比圆角容易剪&#xff0…

100天软件设计师备考计划

我已经毕业并且刚刚开始工作&#xff0c;目前在一家小公司从事Java开发工作。虽然我的工作轻松&#xff0c;但我希望在空闲时间里能够提升自己。由于我的专业与计算机相关&#xff0c;我有一定的基础&#xff0c;因此我计划在2023年用100天的时间考取软件设计师资格。在学习的过…

GB/T 25000.51解读——软件产品的易用性怎么测?

GB/T 25000.51-2016《软件产品质量要求和测试细则》是申请软件检测CNAS认可一定会用到的一部国家标准。在前面的文章中&#xff0c;我们为大家整体介绍了GB/T 25000.51-2016《软件产品质量要求和测试细则》国家标准的结构和所涵盖的内容以及对软件产品的八大质量特性中的功能性…

怎么在电脑中创建虚拟加密磁盘?

在生活和工作中&#xff0c;我们可以将重要数据存放在电脑加密磁盘中。可是不是每个电脑都拥有加密磁盘的。那么我们该怎么在电脑中创建虚拟加密磁盘呢&#xff1f; 将普通磁盘加密 我们可以将重要数据分类存放在一个磁盘中&#xff0c;随后将该磁盘加密&#xff0c;使其变成加…

Mac 快速生成树形项目结构目录

我这里使用的是通过包管理 Homebrew安装形式。没有安装的话可以自行搜索 Homebrew 安装方式 brew install tree直接到项目的根目录执行 tree 命令 tree 效果如下&#xff1a; or &#xff1a; tree -CfL 3效果如下&#xff1a;

Java的第十三篇文章——JAVA多线程

目录 学习目标 1. 线程的基本概念 1.1 进程 1.2 线程 2. Java实现线程程序 2.1 java.lang.Thread类 2.2 线程的内存图 2.3 Thread类的方法 3. Java实现线程程序 3.1 java.lang.Runnable接口 3.2 实现接口的好处 4. 线程安全 4.1 售票例子 4.2 同步代码块 4.3 同…

大学生活题解

样例输入&#xff1a; 3 .xA ... Bx.样例输出&#xff1a; 6思路分析&#xff1a; 这道题只需要在正常的广搜模板上多维护一个— —方向&#xff0c;如果当前改变方向&#xff0c;就坐标不变&#xff0c;方向变&#xff0c;步数加一&#xff1b;否则坐标变&#xff0c;方向不…

在使用《快递批量查询高手》时从TXT文本导入的快递单号出现乱码如何解决。

在日常 工作中&#xff0c;有没有单号用TXT 文档保存吗&#xff1f;那么没有出现这种情况呢&#xff0c;打开TXT文档进去看都是正常没有问题&#xff0c;一但导入软件中就出现乱码的&#xff1f;遇到这个种情况需要什么解决呢&#xff1f;小编今天就教 您一招解决好方法&#x…

Linux新手小程序——进度条

前言 目录 前言 需要先了解 1.\r和\n 2.缓冲区 一.理解字符的含义&#xff1a; 学习c语言时&#xff0c;我们可以粗略把字符分为可显字符和控制字符. 在按回车换到下一行开始的操作时&#xff0c;实际上是进行了两个操作&#xff1a;1.让光标跳到下一行&#xff08;只…

CSS3新增选择器(属性选择器、结构伪类选择器、伪元素选择器)

1 属性选择器 属性选择器&#xff08;[属性]&#xff09;可以根据元素的属性和属性值来对符合要求的元素进行选择。 属性选择器的基础语法如下表&#xff1a; 语法说明标签[属性] {}选择有目标属性的标签标签[属性"value"] {}选择有目标属性且属性值为"value…

iOS--通知、代理、单例模式总结

通知 概要 观察者和被观察者都无需知晓对方&#xff0c;只需要通过标记在NSNotificationCenter中找到监听该通知所对应的类&#xff0c;从而调用该类的方法。并且在NSNotificationCenter中&#xff0c;观察者可以只订阅某一特定的通知&#xff0c;并对齐做出相应操作&#xf…