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空格填充。
Created: 2019-06-21 周五 12:20