密码学实战 - HTB Lost Modulus

412 阅读2分钟

概述

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算法,pq是随机生成的素数,e是3。

根据RSA算法

mec(modn)m ^ e \equiv c \pmod {n}

虽然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)