概述
Lost Modulus是来自于HTB(hackthebox.com)的一个容易级密码学挑战,完成该挑战所需要掌握的知识点在于RSA算法。
题目分析
相关的任务文件包括Python源代码文件challenge.py以及文本文件output.txt。
challenge.py内容节选如下
#!/usr/bin/python3
from Crypto.Util.number import getPrime, long_to_bytes, inverse
flag = open('flag.txt', 'r').read().strip().encode()
class RSA:
def __init__(self):
self.p = getPrime(512)
self.q = getPrime(512)
self.e = 3
self.n = self.p * self.q
self.d = inverse(self.e, (self.p-1)*(self.q-1))
def encrypt(self, data: bytes) -> bytes:
pt = int(data.hex(), 16)
ct = pow(pt, self.e, self.n)
return long_to_bytes(ct)
def decrypt(self, data: bytes) -> bytes:
ct = int(data.hex(), 16)
pt = pow(ct, self.d, self.n)
return long_to_bytes(pt)
def main():
crypto = RSA()
print ('Flag:', crypto.encrypt(flag).hex())
output.txt给出了Flag的密文
Flag: 05c61636499a82088bf4388203a93e67bf046f8c49f62857681ec9aaaa40b4772933e0abc83e938c84ff8e67e5ad85bd6eca167585b0cc03eb1333b1b1462d9d7c25f44e53bcb568f0f05219c0147f7dc3cbad45dec2f34f03bcadcbba866dd0c566035c8122d68255ada7d18954ad604965
解题过程
以上代码实现的是基本的RSA算法,p和q是随机生成的素数,e是3。
根据RSA算法
虽然n未知,由于e等于3,我们可以直接对密文求立方根, 如果得到整数结果的话,那么就得到明文了。
from Crypto.Util.number import bytes_to_long, long_to_bytes
from sympy import integer_nthroot
c = 0x05c61636499a82088bf4388203a93e67bf046f8c49f62857681ec9aaaa40b4772933e0abc83e938c84ff8e67e5ad85bd6eca167585b0cc03eb1333b1b1462d9d7c25f44e53bcb568f0f05219c0147f7dc3cbad45dec2f34f03bcadcbba866dd0c566035c8122d68255ada7d18954ad604965
## 对密文求立方根
m = integer_nthroot(c, 3)
#输出立方根结果
print("m=", m)
#m= (9208566198168854769137135900129825812636831889153009607082441577495048346488797274341323901, True)
# 输出明文
FLAG = long_to_bytes(m[0])
print("FLAG = ", FLAG)