AES CBC模式下的CBC bit flipping Attack
1 简介
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
Created: 2019-06-21 周五 18:14