其他分享
首页 > 其他分享> > AES CBC模式下的CBC bit flipping Attack

AES CBC模式下的CBC bit flipping Attack

作者:互联网

<?xml version="1.0" encoding="utf-8"?> AES CBC模式下的CBC bit flipping Attack <style type="text/css"> </style> <body>

AES CBC模式下的CBC bit flipping Attack

目录

1 简介

如果理解了上一篇的padding oracle attack,则CBC字节翻转攻击很容易理解,上一篇也通过修改IV达到了修改第一个加密分组的效果。 CBC字节翻转也类似,在有加密IV并可以修改IV值和能获得服务器返回的明文结果的情况下,通过修改IV获得想要的明文结果。

2 字节翻转攻击测试

还以上一节的测试程序为例子。用字节翻转攻击修改解密后的明文。

# coding=utf-8

import re
import base64
from test_req import *
from padding_oracle import *

########################### 实际测试代码 #################


def b64_url_dec(s):
    return s.replace('~', '=').replace('!', '/').replace('-', '+')


def b64_url_enc(s):
    return s.replace('+', '-').replace('/', '!').replace('=', '~')


def bytes_to_str(data):
    return "".join(chr(x) for x in bytearray(data))


def my_dec_req(data):
    '''测试解密,注意这里的data是原始字节,直接解密出明文'''
    txt = b64_url_enc(bytes_to_str(base64.b64encode(data)))
    return test_dec(txt)


test_txt = 'this is a long long test'
test1 = test_enc(test_txt)
test_data = base64.b64decode(b64_url_dec(test1))

# 解密出原始明文
my_dec_req(test_data)

############### 此处的代码跟padding oracle attack 测试实现的代码一样


def pad_bs_space(s):
    '''不足一个分组长的字符串 填充空格'''
    return s + ' ' * (BS - len(s))

# padding oracle可以实现伪造第一个数据分组的内容,因为iv是可以改变的,
# 改变原始iv,就相当于改变了第一个数据分组的解密结果。
def build_fake_first(data, fake_data, data_is):
    ''' data为密文数据
    fake_data 伪造的第一个分组数据
    data_is 解密出的中间状态值'''
    if len(fake_data) > BS:
        raise Exception('fake data too large!')
    new_data = bytearray(data)
    fake_group_data = pad_bs_space(fake_data)
    for i in range(BS):
        new_data[i] = ord(fake_group_data[i]) ^ data_is[i]
    return new_data

################################# cbc字节反转 

def data_xor(xs, ys):
    '''xor两个序列'''
    return bytes([x ^ y for (x, y) in zip(xs, ys)])


def cbc_xor(data, fake_data, org_data):
    '''使用cbc xor构造第一个伪造数据
    data 加密后的密文,前16字节为iv
    fake_data 要伪造的明文
    org_data 原始明文,只有前16个字节的明文即可'''
    data_is = data_xor(data[0:BS], bytes(org_data[0:BS], 'utf-8'))
    return build_fake_first(data, fake_data, data_is)

new_data=cbc_xor(test_data, "admin pass", test_txt)
my_dec_req(new_data)
#  'admin pass      ong test'
# 可以看到前16个字节被修改了。不过加了pad空格填充。

作者: ntestoc

Created: 2019-06-21 周五 12:20

标签:CBC,AES,return,字节,flipping,fake,test,data
来源: https://www.cnblogs.com/ntestoc/p/11063894.html