密码学实战 - HTB xorxorxor

243 阅读2分钟

概述

Baby xorxorxor是来自于HTB(hackthebox.com)的一个入门级密码学挑战,完成该挑战需要对XOR运算有基本的了解。

题目分析

相关的任务文件包括Python源代码文件challenge.py以及包含一串16进制数的文本文件output.txt

challenge.py内容如下

#!/usr/bin/python3
import os
flag = open('flag.txt', 'r').read().strip().encode()

class XOR:
    def __init__(self):
        self.key = os.urandom(4)
    def encrypt(self, data: bytes) -> bytes:
        xored = b''
        for i in range(len(data)):
            xored += bytes([data[i] ^ self.key[i % len(self.key)]])
        return xored
    def decrypt(self, data: bytes) -> bytes:
        return self.encrypt(data)

def main():
    global flag
    crypto = XOR()
    print ('Flag:', crypto.encrypt(flag).hex())

if __name__ == '__main__':
    main()

output.txt内容如下

Flag: 134af6e1297bc4a96f6a87fe046684e8047084ee046d84c5282dd7ef292dc9

challenge.py定义了一个XOR类,其初始化时使用os.urandom方法随机生成一个长度为4的字节数组作为密匙,encrypt方法则是对明文中的各个字节依次与密匙中的对应的字节进行XOR操作以生成密文, 而decrypt方法则调用encrypt以相同的步骤对密文进行解密。

解题思路

密匙是随机生成的,所以我们不可能知道其内容,但我们知道明文(p)的前四个字符是HTB{,通过XOR的如下属性我们可以将密文(e)的前四个字符与HTB{依次进行XOR,其结果就是密匙(k)。

       e XOR k = p

e XOR k XOR e = p XOR e

e XOR e XOR k = p XOR e

因为e XOR e = 0, 且 0 XOR k = k

            k  = p XOR e 

得到完整的密匙后,就可使用提供的步骤对密文进行解密。

解题代码

##16进制数密文
encrypted = '134af6e1297bc4a96f6a87fe046684e8047084ee046d84c5282dd7ef292dc9'

##将密文转换为bytes
encryptedBytes = bytes.fromhex(encrypted)

##明文前缀
flagPrefix = b'HTB{'

##密匙
key = bytearray(4)

##获取密匙
for i in range(4):
  #k  = p XOR e
  key[i] = flagPrefix[i] ^ encryptedBytes[i]

##明文
flag = b''

##解密
for i in range(len(encryptedBytes)):
  flag += bytes([encryptedBytes[i] ^ key[i % len(key)]])

##输出明文
print("flag :", flag)