记两道AES-CBC题

news2024/11/28 10:42:10

文章目录

  • 知识导入(AES-CBC模式)
  • 题一(buu [ACTF新生赛2020]crypto-aes 1)
    • 题目描述:
    • 题目分析:
      • 知识导入
        • os.urandom(n)函数
        • 比特,字节,二进制数之间的关系
        • AES.new(key,AES.MODE_CBC,iv)
  • 题二(crack AES-CBC IV)
    • 题目描述:
    • 题目分析:

知识导入(AES-CBC模式)

在这里插入图片描述
在这里插入图片描述

加密过程

1、首先将明文分组(常见的以16字节为一组),位数不足的使用特殊字符填充。
2、生成一个随机的初始化向量(IV)和一个密钥。
3、将IV和第一组明文异或。
4、用key对3中xor后产生的密文加密。
5、用4中产生的密文对第二组明文进行xor操作。
6、用key对5中产生的密文加密。
7、重复4-7,到最后一组明文。
8、将IV和加密后的密文拼接在一起,得到最终的密文。

解密过程
(加密的逆过程)

设明文为X,密文为Y,解密函数为k。

X[i] = k(Y[i]) Xor Y[i-1]

题一(buu [ACTF新生赛2020]crypto-aes 1)

题目描述:

from Cryptodome.Cipher import AES
import os
import gmpy2
from flag import FLAG
from Cryptodome.Util.number import *

def main():
    key=os.urandom(2)*16
    iv=os.urandom(16)
    print(bytes_to_long(key)^bytes_to_long(iv))
    aes=AES.new(key,AES.MODE_CBC,iv)
    enc_flag = aes.encrypt(FLAG)
    print(enc_flag)
if __name__=="__main__":
    main()
# xor = 91144196586662942563895769614300232343026691029427747065707381728622849079757
# enc_flag = b'\x8c-\xcd\xde\xa7\xe9\x7f.b\x8aKs\xf1\xba\xc75\xc4d\x13\x07\xac\xa4&\xd6\x91\xfe\xf3\x14\x10|\xf8p'

题目分析:

知识导入

os.urandom(n)函数

os.urandom(n)是一个函数
用于生成指定长度的随机字节串
函数参数n表示要生成的字节数

比特,字节,二进制数之间的关系

比特(Bit):计算机信息处理的最小单位,表示二进制数字0或1。一个比特只能表示0或1两种状态
字节(Byte):计算机存储空间的基本计量单位,通常由8个比特组成,可以表示256种不同的状态,即从0到255的所有整数
二进制数:32位的二进制数10101010101010101010101010101010,可以将其拆分成4个字节10101010 10101010 10101010 10101010,每个字节可以表示一个整数,得到170 170 170 170

AES.new(key,AES.MODE_CBC,iv)

AES.new(key,AES.MODE_CBC,iv)
key: 加密密钥
AES.MODE_CBC: 加密模式,此处为CBC模式
iv: 初始化向量
enc_flag = aes.encrypt(flag) --> 表示对flag进行aes_cbc模式的加密,然后得到密文enc_flag

回到题目:

  • key由32个字节组成,iv由16个字节组成,32个字节 ^ 16个字节,得到32个字节的数据,其中该数据前16个字节=key的前16个字节,由此便可求出完整的key
  • 再由key的后16个字节 ^ enc_flag后16个字节即可得到初始化向量iv
  • 解题代码:
    (注:若a ^ b = c,那么a = c ^ b, b = c ^ a)
from Cryptodome.Cipher import AES
from Cryptodome.Util.number import *
xor = 91144196586662942563895769614300232343026691029427747065707381728622849079757
enc_flag = b'\x8c-\xcd\xde\xa7\xe9\x7f.b\x8aKs\xf1\xba\xc75\xc4d\x13\x07\xac\xa4&\xd6\x91\xfe\xf3\x14\x10|\xf8p'
key_bytes = long_to_bytes(xor)[:16] * 2
iv = bytes_to_long(key_bytes) ^ xor
iv_bytes = long_to_bytes(iv)
aes = AES.new(key_bytes,AES.MODE_CBC,iv_bytes)
flag = aes.decrypt(enc_flag)
print(flag)
# actf{W0W_y0u_can_so1v3_AES_now!}

题二(crack AES-CBC IV)

题目描述:

from Crypto.Cipher import AES

key = "09e6855d293a1b86ff44f18948b19bac".decode("hex")
cipherText1 = "ed64978b91ef5b62561a44c8f529b91f".decode("hex")
cipherText = "fd6dd5e0f9ab258b2bc9c813177e3ad677116d2f08c69517d0e7796c1f5e06ba95c3de5a139bb687bf3e779a0730e47c".decode(
    "hex")
plainText1 = "CBC_Cr4cked_succ"
iv = raw_input("give me iv :> ")
aes = AES.new(key, AES.MODE_CBC, iv)
aes1 = AES.new(key, AES.MODE_CBC, iv)

if aes.decrypt(cipherText1) == plainText:
    flag = input("give me flag :> ")
    if aes1.encrypt(flag) == cipherText:
        print("you get it")
    else:
        print("nonono")
else:
    print("nonono")

题目分析:

  • 由题目描述可知该题是要先求iv,再通过iv求出明文m
  • 已知:
key = "09e6855d293a1b86ff44f18948b19bac".decode("hex")
cipherText1 = "ed64978b91ef5b62561a44c8f529b91f".decode("hex")
cipherText = "fd6dd5e0f9ab258b2bc9c813177e3ad677116d2f08c69517d0e7796c1f5e06ba95c3de5a139bb687bf3e779a0730e47c".decode("hex")
plainText1 = "CBC_Cr4cked_succ"
iv  = ''
  • 经点播,原来要伪造一个fake_iv,然后:

    用 fake_iv ^ cipherText1 = enc_msg
    又 enc_msg = decrypt(cipherText1) (即用密钥对对密文解密的过程)
    因为 decrypt(cipherText1) = enc_msg (即用密钥对对密文解密的过程)
    然后 fake_iv ^ enc_msg = fake_plainText
    所以 enc_msg = fake_plainText ^ fake_iv
    又   plainText ^ iv = decrypt(cipherText1) = enc_msg = fake_plainText ^ fake_iv
    最终
    得到 iv = fake_plainText ^ fake_iv ^ plainText
    然后用iv,key,对cipherText解密即可得到最终flag
    
  • 代码如下:

from Cryptodome.Cipher import AES
from Cryptodome.Util.number import *
key = bytes.fromhex("09e6855d293a1b86ff44f18948b19bac")
cipherText1 = bytes.fromhex("ed64978b91ef5b62561a44c8f529b91f")
cipherText = bytes.fromhex("fd6dd5e0f9ab258b2bc9c813177e3ad677116d2f08c69517d0e7796c1f5e06ba95c3de5a139bb687bf3e779a0730e47c")
plainText1 = b"CBC_Cr4cked_succ"
fake_iv = b'aaaaaaaaaaaaaaaa'
fake_iv_aes = AES.new(key,AES.MODE_CBC,fake_iv)
fake_plainText = fake_iv_aes.decrypt(cipherText1)
iv = bytes_to_long(fake_plainText) ^ bytes_to_long(fake_iv) ^ bytes_to_long(plainText1)
iv_bytes = long_to_bytes(iv)
aes1 = AES.new(key,AES.MODE_CBC,iv_bytes)
flag = aes1.decrypt(cipherText)
print(flag)
# we_ax{cr4ck_43s_CBC_Cr4cked_succ3ssfu11y!_asdfg}

也可以:

key = 0x09e6855d293a1b86ff44f18948b19bac
key = long_to_bytes(key)
cipherText1 = 0xed64978b91ef5b62561a44c8f529b91f
cipherText1 = long_to_bytes(cipherText1)
cipherText = 0xfd6dd5e0f9ab258b2bc9c813177e3ad677116d2f08c69517d0e7796c1f5e06ba95c3de5a139bb687bf3e779a0730e47c
cipherText = long_to_bytes(cipherText)
plainText1 = b"CBC_Cr4cked_succ" # 16个字节
fake_iv = b'aaaaaaaaaaaaaaaa' # 16个字节
aes = AES.new(key,AES.MODE_CBC,fake_iv)
fake_plainText = aes.decrypt(cipherText1)
iv = bytes_to_long(fake_plainText) ^ bytes_to_long(fake_iv) ^ bytes_to_long(plainText1)
iv_bytes = long_to_bytes(iv)
aes1 = AES.new(key,AES.MODE_CBC,iv_bytes)
flag = aes1.decrypt(cipherText)
print(flag)

注:
在Python 2中, decode(“hex”) 方法将其解码成二进制形式的字符串
在Python 3中, decode(“hex”) 方法已经被移除了,而使用字节串(bytes)和字节串相应的方法来处理二进制数据。如果使用Python 3,请使用 bytes.fromhex() 方法来将十六进制字符串转换成字节串的形式

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

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

相关文章

小黑子—Java从入门到入土过程:第九章-IO流

Java零基础入门9.0 Java系列第九章- IO流1. 初识IO流2. IO流的体系2.1 字节流2.1.1 FileOutputStream 字符串输出流2.1.1 - I 字符串输出流的细节2.1.1 - II FileOutputStream写数据的3种方式2.1.1 -III FileOutputStream写数据的两个小问题 2.1.2 FileInputStream 字符串输入流…

点线面产生局部坐标系以及计算到世界坐标系的旋转矩阵

欢迎关注更多精彩 问题描述 给定点O,线段AB,平面OP,求以OP法向为某一轴,以AB在OP上的投影为另一轴,O为原点的局部坐标系。要求给出X,Y,Z轴的单位向量,以及原点O. 求出转换到世界坐标系的旋转矩阵RT。 如…

ChatGPT的简单了解

ChatGPT 是 InstructGPT 的同级模型,它经过训练可以按照提示中的说明进行操作并提供详细的响应。 InstructGPT论文:https://arxiv.org/pdf/2203.02155.pdf InstructGPT怎么准备和标记数据集:https://harryliu.blog.csdn.net/article/detail…

【连续介质力学】张量的性质2

张量的代数操作 张量的性质 张量迹 Tensor Trace 定义 e ^ i ⨂ e ^ j \hat e_i \bigotimes \hat e_j e^i​⨂e^j​的迹: T r ( e ^ i ⨂ e ^ j ) e ^ i ⋅ e ^ j δ i j Tr(\hat e_i \bigotimes \hat e_j) \hat e_i \cdot \hat e_j \delta_{ij} Tr(e^i​⨂e^j​)e^i​⋅…

总结如何申请注册 GitHub 教师教育优惠 Benefits for Teachers 来免费使用 copilot

目录 1. GitHub 教师教育优惠有什么2. 如何申请教师教育优惠呢2.1 选择学校2.2 更改个人信息2.3 准备证明材料2.4 提交申请2.5 遇到的问题2.5.1 问题 12.5.2 问题 22.5.3 问题 3 3. 申请免费的 GitHub Copilot 学生注册不在此处赘述了,网上有很多教程可以参考。但是…

软件测试面试面对HR提出的问题,怎么回答才不会被面试官“套路”

面试中,如何回答HR提出的问题很大程度上决定了面试能不能成功。 下面是软件测试人员在面试过程中经常被问到的10个问题,告诉你怎么回答才不会被面试官套路...... 请你做一个自我介绍 误区: 一般人回答这个问题过于平常,只说姓…

JVM学习(一)

一、JVM介绍 1.1基本概念 JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接 的交互。 1.2 运行过程 我们都知道 Java …

1000W用户1Wqps高并发签到系统的架构和实操

说在前面 在尼恩的(50)读者社群中,经常有小伙伴面试的时候,遇到一个一个高并发 架构方面的问题,比如: (1) 高并发秒杀系统如何架构? (2) 高并发签到系统如何架构? (3) 等等等等… 刚…

【C++】函数高级

目录 🍊一.函数的默认参数🍊 1.默认参数的性质 2.函数默认参数的注意事项 🍎二.函数的占位参数🍎 🍏三.函数的重载 🍏 1.重载的性质和条件 (1)修改参数的个数 &#xff…

go语言中文文档 学习笔记(未完)

这里写目录标题 网络编程互联网协议介绍socket编程socket图解TCP编程服务端客户端 UDP编程TCP黏包 http编程WebSocket编程 网络编程 互联网协议介绍 socket编程 socket图解 Socket是应用层与TCP/IP协议族通信的中间软件抽象层。在设计模式中,Socket其实就是一个门…

12.设计模式之门面模式

前言 门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。日志框架slf4J是门面模式最经典的应用场景。 本节,我们就门面模式,展开详细介绍…

1.setContentView流程分析

1. setContentView初步分析之继承自Activity 我们创建的MainActivity继承自Activity,在代码中使用setContentView(R.layout.activity_main),查看他在Activity中的源码如下: public void setContentView(LayoutRes int layoutResID) {//这里的getWindow方法获取到一个PhoneWind…

什么是好代码/坏代码?给普通人的图解示例

本文翻译自国外论坛 medium,原文地址:https://medium.com/todbotts.triangles/what-is-good-bad-code-an-illustrated-example-for-non-programmers-1222b600a0f0 我曾经在某个地方读到过一句话,基本上有以下内容: 在现代世界中&a…

算法(一)—— 回溯(3)

文章目录 1 78 子集2 90 子集II3 491 递增子序列 子集问题 1 78 子集 如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题是收集树的叶子节点,而子集问题是找树的所有节点! 因为需要找到所有的节点&#xff0…

JavaEE(系列一 )-- 计算机是如何进行工作的

目录 1. 操作系统 2. 进程/任务(Process/Task) 2.1 进程 2.2 进程管理 2.2.1 进程的结构体 2.2.2 进程调度 2.3 并行 和 并发 2.4 内存分配 -- 内存管理(Memory Manage) 2.5 进程间通信 3. 线程 1. 操作系统 操作系统是一组做计算机资源管理的软件的…

谷歌I/O大会重磅发布:Bard编码能力优化后仍不支持中文,开发者选择CodeGeeX更佳

谷歌I/O大会今天凌晨发布,打出系列AI组合拳。除了发布升级版语言模型PaLM2之外,Bard能力也要起飞。 凭借改进的数学、逻辑和推理技能,Bard 现在可以帮助生成、解释和调试 20 多种编程语言的代码,开发者们需要输入prompt&#xff0…

C#从入门到入坟(原创不易,转载请注明出处)

文章目录 C# 基础篇0 环境部署1 Hello world1.1 两种框架1.2 创建项目的过程1.3 项目组成结构1.3.1 解决方案和项目1.3.2 程序集信息1.3.3 引用1.3.4 配置文件1.3.5 程序入口类 1.4 解决方案1.5 Debug 和 Release1.6 CSharp虚拟机初始1.7 .Net Framework混合语言开发1.8 托管代…

上下文感知的体素对比学习用于标签高效的多器官分割

文章目录 Context-Aware Voxel-Wise Contrastive Learning for Label Efficient Multi-organ Segmentation摘要本文方法有监督损失Context-Aware Contrastive Learning Loss for Unlabeled Voxels 实验结果 Context-Aware Voxel-Wise Contrastive Learning for Label Efficient…

GSMA-eSIM-官网规范说明

GSMA | eSIM Consumer and IoT Specifications - eSIM GSMA | eSIM Consumer and IoT Specifications - eSIMhttps://www.gsma.com/esim/esim-specification/ 架构、测试、技术规范 3.0版本 测试套件 EID的定义和分配 GSMA EID Definition and Assignment 合规性规范 自我评…

第十四届蓝桥杯青少组模拟赛Python真题 (2023年2月12日),包含答案

第十四届蓝桥杯青少组模拟赛Python真题 (2023年2月12日) 一、选择题 第 1 题 单选题 关于Python3.10,下列选项描述正确的是 ( )。 答案:B 第 2 题 单选题 下列数据类型中,哪一个是不可变的?() 答案:B 第 3 题 单选题 以下关于函数参数描述正确的是 ()。 答案:D 第 …