密码学实战 - HTB Baby Encryption

434 阅读2分钟

概述

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)与其对应的明文字符可以用如下模数方程表达

123char+18b(mod256)123 * char + 18 \equiv b \pmod {256}

通过如下模数运算步骤可以求解char

123char+18b(mod256)123charb18(mod256)1231231char(b18)1231(mod256)char(b18)1231(mod256)123 * char + 18 \equiv b \pmod {256} \\ 123 * char \equiv b - 18\pmod {256} \\ 123 * 123^{-1} * char \equiv (b - 18) * 123^{-1} \pmod {256} \\ char \equiv (b - 18) * 123^{-1} \pmod {256} \\

以上步骤需要对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))