概述
Baby Encryption是来自于HTB(hackthebox.com)的一个入门级密码学挑战,完成该挑战需要对模数运算有基本的了解。
题目分析
相关的任务文件包括Python源代码文件chall.py以及包含一串16进制数的文本文件msg.enc。
chall.py内容如下
import string
from secret import MSG
def encryption(msg):
ct = []
for char in msg:
ct.append((123 * char + 18) % 256)
return bytes(ct)
ct = encryption(MSG)
f = open('./msg.enc','w')
f.write(ct.hex())
f.close()
msg.enc内容如下
6e0a9372ec49a3f6930ed8723f9df6f6720ed8d89dc4937222ec7214d89d1e0e352ce0aa6ec82bf622227bb70e7fb7352249b7d893c493d8539dec8fb7935d490e7f9d22ec89b7a322ec8fd80e7f8921
chall.py通过encryption方法来对明文进行加密,并将加密的结果转化为16进制数后写入msg.enc文件。 加密过程在于对于明文中的每个字符依次进行如下的运行,
(123 * char + 18) % 256
解题思路
首先将msg.enc中的16进制数字串转化为相应的bytes对象,其中的每个字符(b)与其对应的明文字符可以用如下模数方程表达
通过如下模数运算步骤可以求解char
以上步骤需要对123进行模倒数计算,使用Python 3.8或之后的版本可以通过Python内置的pow方法进行。
解题代码
##16进制数密文
encoded = '6e0a9372ec49a3f6930ed8723f9df6f6720ed8d89dc4937222ec7214d89d1e0e352ce0aa6ec82bf622227bb70e7fb7352249b7d893c493d8539dec8fb7935d490e7f9d22ec89b7a322ec8fd80e7f8921'
##将密文转换为bytes
encodedBytes = bytes.fromhex(encoded)
##明文
message = []
for b in encodedBytes:
##模数求解, 123的模倒数 pow(123, -1, 256) = 179
char = (b - 18) * pow(123, -1, 256)
char = char % 256
message.append(char)
##输出明文
print("message :", bytes(message))