ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AES CBC模式下的CBC bit flipping Attack

2019-06-21 12:42:50  阅读:483  来源: 互联网

标签:CBC AES return 字节 flipping fake test data


<?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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有