AES CBC模式下的CBC bit flipping Attack

<?xml version="1.0" encoding="utf-8"?> AES CBC模式下的CBC bit flipping Attack

AES CBC模式下的CBC bit flipping Attack

1 简介

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

2 字节翻转攻击测试

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

测试请求数据:

def my_dec_req(data):
    '''测试解密,注意这里使用test_dec函数,直接解密出明文'''
    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))

# 解密出原始明文
print('decoded text:', my_dec_req(test_data))
decoded text: this is a long long test

修改my_dec_req直接解密出明文。

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)

from urllib.parse import quote
print("decoded text:", quote(my_dec_req(new_data)))
decoded text: admin%20pass%06%06%06%06%06%06ong%20test

可以看到前16字节明文被成功替换,不过因为伪造的字符串不够16个字节,添加了padding:

使用空格代替pkcs7 padding:

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

new_data=cbc_xor(test_data, pad_bs_space("admin pass"), test_txt)
print("decoded text:", my_dec_req(new_data))
decoded text: admin pass      ong test

作者: ntestoc

Created: 2019-06-21 周五 18:14

转载于:https://www.cnblogs.com/ntestoc/p/11063894.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值