数据填充

首先拿到压缩包,解压后得到加密算法脚本

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import os
import sys

BLOCK_SIZE = 8
key = os.urandom(BLOCK_SIZE)
iv = os.urandom(BLOCK_SIZE)#获得随机8字节字符串
def pad(data):
    padding_len = BLOCK_SIZE - len(data) % BLOCK_SIZE
    return data + (chr(padding_len) * padding_len).encode()#对数据进行8字节填充

def xor(data,key):
    return bytes([x ^ key[i%len(key)] for i, x in enumerate(data)])#做异或运算,enumerate()返回下标和对应数据

def encrypt(data):
    padded_msg = pad(data)
    padded_msg_count = len(padded_msg) // BLOCK_SIZE
    c = []
    TempIV = iv
    for i in range(padded_msg_count):
        xored_plain = xor(padded_msg[i*BLOCK_SIZE:(i+1)*BLOCK_SIZE], TempIV)
        cipher_text = xor(xored_plain, key)
        TempIV = cipher_text
        c.append(cipher_text)
    return b''.join(c)


if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('usage: %s ')
        sys.exit(0)
    print(key.hex())
    print(iv.hex())
    with open(sys.argv[1], 'rb') as f:
        encrypted = encrypt(f.read())

    with open(sys.argv[1]+'.encrypted', 'wb') as f:
        f.write(encrypted)


通过对加密算法的分析,可知加密原理为先将数据进行8字节填充,然后在8位逐段进行加密,加密的方式为先与Tempiv做异或,然后再与key做异或,之后将加密后的数据赋值给Tempiv更新.进行下一段的加密.
解密的过程同样是进行逐段解密,题目已经告诉了明文前一段为have a good time通过16进制打开后获取其16进制表示,可以发现这是两段8字节.在后一段,我们已经知道了此时的Tempiv(在密文中可以找到),因此将该Tempiv与后一段做异或运算我们就可以得到key(key是不会更新的)
所以在解密的过程中每一段的key和Tempiv(上一段密文)都可以得到,因此整个明文就可以得到了(后面会有部分乱码,应该是填充部分)
下面是脚本(在原脚本上稍微改动一下)

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import os
import sys

BLOCK_SIZE = 8
key = b'\xd8\xc2i\xfds\xfd\xe2E'
iv = b'\x7f7\x82\x06\xd0\xcfg\x94'
def pad(data):
    padding_len = BLOCK_SIZE - len(data) % BLOCK_SIZE
    return data + (chr(padding_len) * padding_len).encode()

def xor(data,key):
    return bytes([x ^ key[i%len(key)] for i, x in enumerate(data)])

def encrypt(data):
    padded_msg = pad(data)
    padded_msg_count = len(padded_msg) // BLOCK_SIZE
    c = []
    TempIV = iv
    for i in range(1,padded_msg_count):
        xored_plain = xor(padded_msg[i*BLOCK_SIZE:(i+1)*BLOCK_SIZE], key)
        cipher_text = xor(xored_plain, padded_msg[(i-1)*BLOCK_SIZE:i*BLOCK_SIZE])
        c.append(cipher_text)
    return b''.join(c)


if __name__ == '__main__':
    if len(sys.argv) < 2:
        print('usage: %s ')
        sys.exit(0)
    
    with open(sys.argv[1], 'rb') as f:
        encrypted = encrypt(f.read())

    with open(sys.argv[1]+'.encrypted', 'wb') as f:
        f.write(encrypted)


打开cmd运行后会生成一个明文文件.
在这里插入图片描述
(注,是从第二段开始解密的)

你可能感兴趣的:(数据填充)