# coding:utf-8
from Crypto.Cipher import AES
import base64 def encrypt(iv, plaintext):
if len(plaintext) % 16 != 0:
print("plaintext length is invalid")
return
if len(iv) != 16:
print("IV length is invalid")
return
key = b"1234567890123456"
aes_encrypt = AES.new(key, AES.MODE_CBC, IV=iv)
result = base64.b64encode(aes_encrypt.encrypt(plaintext))
return result def decrypt(iv, cipher):
if len(iv) != 16:
print("IV length is invalid")
print(len(iv))
return
key = b"1234567890123456"
aes_decrypt = AES.new(key, AES.MODE_CBC, IV=iv)
result = (aes_decrypt.decrypt(base64.b64decode(cipher)))
return result def test1():
print("Change the first block plaintext:\n")
iv = b'ABCDEFGH12345678'
plaintext = b'0123456789ABCDEFhellocbcflipping0123456789123456'
cipher = encrypt(iv, plaintext)
print("NO ATTACK:", end='')
print(cipher)
local=2
before='2'
target='z'
iv = list(iv)
iv[local] = iv[local] ^ ord(before) ^ ord(target)
decipher = decrypt(bytes(iv), cipher)
print("ATTACK SUCCESS: Ciphertext doesn't need to be changed")
print("NOW PLAINTEXT:",end='')
print(decipher)
print("NEW IV(base64 encode):",end='')
print(base64.b64encode(bytes(iv))) def test2():
iv = b'ABCDEFGH12345678'
plaintext = b'0123456789ABCDEFhellocbcflipping0123456789123456'
cipher = encrypt(iv, plaintext)
print("NO ATTACK:",end='')
print(cipher)
cipher = attack(cipher, 31, 'g', 'G')
# 进行攻击 cipher是密文,31代表第几位,‘g’是原本的字符,‘G’是改变的字符
decipher=decrypt(iv,cipher)
print("NOW PLAINTEXT:", end='')
print(decipher)
#由于改变了密文,导致前一组解密乱码,需要修改iv值,先要求出新密文
newiv=re(iv,decipher,b'0123456789ABCDEF')
#求新的iv值,传入原iv值,新密文,和已知明文
de_cipher = decrypt(newiv, cipher)
print("NOW PLAINTEXT(NEW IV):", end='')
print(de_cipher) def attack( cipher, local, before, target): cipher = base64.b64decode(cipher)
cipher = list(cipher)
cipher[local - 16] = cipher[local - 16] ^ ord(before) ^ ord(target)
cipher = base64.b64encode(bytes(cipher))
print("ATTACK SUCCESS:",end='')
print(cipher)
return cipher def re(iv, decipher, cleartext):
decipher = list(decipher)
cleartext = bytearray(cleartext)
bin_iv=bytearray(iv)
for i in range(0,len(iv)):
bin_iv[i]= (decipher[i] ^ bin_iv[i] ^ cleartext[i])
print("NEW IV(base64 encode):",end='')
print(base64.b64encode(bin_iv))
return bin_iv test1()
#test1为改变第一组的函数
#test2()
#test2为改变不是第一组的函数

关于AES-CBC模式字节翻转攻击(python3)的更多相关文章

  1. CBC字节翻转攻击

    iscc2018线上赛开始两周多了,学到了很多,写几篇文章总结一下遇到的知识点,做一个归纳,方便以后查找. web300-----CBC字节翻转攻击 cbc是AES加密的cbc模式 即密码分组链模式: ...

  2. Padding Oracle 和 CBC字节翻转攻击学习

    以前一直没时间来好好研究下这两种攻击方式,虽然都是很老的点了= =! 0x01:Padding oracle CBC加密模式为分组加密,初始时有初始向量,密钥,以及明文,明文与初始向量异或以后得到中间 ...

  3. php AES cbc模式 pkcs7 128位加密解密(微信小程序)

    PHP AES CBC模式PKCS7 128位加密 加密: $key = '1234567812345678'; $iv = '1234567890123456'; $message = '12345 ...

  4. PHP AES cbc模式 pkcs7 128加密解密

    今天在对接一个第三方接口的时候,对方需要AES CBC模式下的加密.这里简单写一个demo class Model_Junjingbao extends Model { private static ...

  5. python 实现 AES CBC模式加解密

    AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现 python 在 Windows下使用AE ...

  6. CBC 字节反转攻击

    一.CBC 简介 现代密码体制 现代密码中的加密体制一般分为对称加密体制(Symmetric Key Encryption)和非对称加密体制(Asymmetric Key Encryption).对称 ...

  7. 实验吧之【简单的登录题(】CBC字节反转攻击)

    开始刷ctf题吧  慢慢来. 实验吧---简单的登录题 题目地址:http://ctf5.shiyanbar.com/web/jiandan/index.php 随便提交一个id,看到后台set了两个 ...

  8. 解决AES算法CBC模式加密字符串后再解密出现乱码问题

    问题 在使用 AES CBC 模式加密字符串后,再进行解密,解密得到的字符串出现乱码情况,通常都是前几十个字节乱码: 复现 因为是使用部门 cgi AESEncryptUtil 库,找到问题后,在这里 ...

  9. CBC加密原理及攻击

    原理基于分组加密加密过程 Plaintext:明文,待加密的数据.IV:用于随机化加密的比特块,保证即使对相同明文多次加密,也可以得到不同的密文,初始向量,用来与第一块的明文异或运算.Key:被一些如 ...

随机推荐

  1. Mac磁盘清理工具——CleanMyMac

    许多刚从Windows系统转向Mac系统怀抱的用户,一开始难免不习惯,因为Mac系统没有像Windows一样的C盘.D盘,分盘分区明显.因此这也带来了一些问题,关于Mac的磁盘的清理问题,怎么进行清理 ...

  2. DC靶机1-9合集

    DC1 文章前提概述 本文介绍DC-1靶机的渗透测试流程 涉及知识点(比较基础): nmap扫描网段端口服务 msf的漏洞搜索 drupal7的命令执行利用 netcat反向shell mysql的基 ...

  3. T147403 「TOC Round 4」吃,都可以吃

    若不考虑 \(m\) 的限制,打表可以发现: 当 \(p=2^n\left(n>1\right)\) 时,最大的 \(f_i\) 是 \(5\),有十个 \(i\) 的 \(f_i\) 是 \( ...

  4. JVM 堆中对象分配、布局和访问

    本文摘自深入理解 Java 虚拟机第三版 对象的创建 Java 是一门面向对象的语言,Java 程序运行过程中无时无刻都有对象被创建出来.从语言层面看,创建对象只是一个 new 关键字而已,而在虚拟机 ...

  5. JQuery 和 Bootstrap

    https://jquery.com/ 1. JQuery  的基础语法 $(select).action() 2. 查找标签 基本选择器 class选择器: $(".className&q ...

  6. 【佛山市选2013】JZOJ2020年8月7日T4 排列

    [佛山市选2013]JZOJ2020年8月7日T4 排列 题目 描述 一个关于n个元素的排列是指一个从{1, 2, -, n}到{1, 2, -, n}的一一映射的函数.这个排列p的秩是指最小的k,使 ...

  7. charles解决乱码

    1.点击help ssl proxying ,install Charles Root Certificate 2.点击安装证书按钮 3:点击下一步按钮 4:选中将所有的证书都放入下列存储 点击浏览按 ...

  8. 掌握 Promise 的逻辑方法

    Promise 是 ES2015 新增的对象 Promise 对象有几个组合方法,可以将多个承诺合并成一个进行处理 分别是 Promise.all, Promise.race, Promise.all ...

  9. 被老猿误解的Python匿名函数lambda

    在<第2.3节 Python运算符大全>老猿这样描述lambda:"上述运算符中有个lambda,这是个lambda就是用来定义一个匿名函数的.老猿认为用处不大,具体内容大家可以 ...

  10. 转:浅析windows下字符集和文件编码存储/utf8/gbk

    最近老猿在学习文件操作及网络爬虫相关知识,发现字符集及编码的处理非常重要,而老猿原来对此了解并不多,因此找了几篇文章看了一下,将老猿认为比较的相关文章转载一下.感谢各位原创大神! 1,字符集 这里主要 ...