攻防世界GFSJ1116 baigeiRSA

题目编号:GFSJ1116

附件下载后是一个out和python文件:

运用RSA的基础算法来解题。

1. 阅读baigei.py

from Crypto.Util.number import inverse

def rsa_decrypt(p, q, e, c):
    # Step 1: 计算 n 和 φ(n)
    n = p * q # n = 33 => 3 * 11
    phi_n = (p - 1) * (q - 1) # φ(n) = 20 => (3 - 1) * (11 - 1)

    # Step 2: 计算私钥 d (e 的模逆): d * e ≡ 1 (mod φ(n)) => 3 * 7 ≡ 1 (mod 20)
    d = inverse(e, phi_n)

    # Step 3: 使用 d 解密密文 c
    m = pow(c, d, n)

    # Step 4: 将解密后的数字转换为字符串
    flag_bytes = m.to_bytes((m.bit_length() + 7) // 8, 'big')
    try:
        flag = flag_bytes.decode('utf-8')
    except UnicodeDecodeError:
        flag = flag_bytes.decode('utf-8', errors='ignore')
    
    return flag

# 示例使用
p = 274539690398523616505159415195049044439
q = 322368694010594584041053487661458382819
e = 65537
c = 40876621398366534035989065383910105526025410999058860023908252093679681817257
n = 88503001447845031603457048661635807319447136634748350130947825183012205093541

flag = rsa_decrypt(p, q, e, c)
print(f"Decrypted flag: {flag}")

2. Yafu分解n为pq

3. 求d,然后计算出m

from Crypto.Util.number import inverse

# 使用yafu分解n得到p和q: n to p*q
# .\yafu-x64.exe "factor(88503001447845031603457048661635807319447136634748350130947825183012205093541)"
# 根据p q e c 计算解密后的明文flag

def rsa_decrypt(p, q, e, c):
    # Step 1: 计算 n 和 φ(n)
    n = p * q # n = 33 => 3 * 11
    phi_n = (p - 1) * (q - 1) # φ(n) = 20 => (3 - 1) * (11 - 1)

    # Step 2: 计算私钥 d (e 的模逆): d * e ≡ 1 (mod φ(n)) => 3 * 7 ≡ 1 (mod 20)
    d = inverse(e, phi_n)

    # Step 3: 使用 d 解密密文 c
    m = pow(c, d, n)

    # Step 4: 将解密后的数字转换为字符串
    flag_bytes = m.to_bytes((m.bit_length() + 7) // 8, 'big')
    try:
        flag = flag_bytes.decode('utf-8')
    except UnicodeD
提供的引用内容中未提及攻防世界misc Miscellaneous - 200 GFSJ0314的详细信息,但可从引用中获取Miscellaneous - 200的部分相关信息。该题目涉及将文本文件中的内容转换为图片,文件中的内容为RGB像素点数据,解题需借助Python的第三方图像处理库PIL(Python Image Library)来实现转换。 以下是几种解题代码示例: ```python from ast import literal_eval from PIL import Image f = open('62f4ea780ecf4e6bbef5f40d674ec073.txt', 'r') corl = [literal_eval(line) for line in f.readlines()] f.close() img = Image.new('RGB', (270, 270), '#ffffff') k = 0 for i in range(246): for j in range(246): img.putpixel([i, j], corl[k]) k = k + 1 img.save("flag.png") ``` ```python #!/user/bin/env python # -*-coding:utf-8 -*- # Author:lip from ast import literal_eval as make_tuple from PIL import Image f = open('flag.txt', 'r') corl = [make_tuple(line) for line in f.readlines()] f.close() img0 = Image.new('RGB', (270, 270), '#ffffff') k = 0 for i in range(246): for j in range(246): img0.putpixel([i, j], corl[k]) k = k + 1 img0.save("result.png") ``` ```python import math from PIL import Image with open("./62f4ea780ecf4e6bbef5f40d674ec073.txt", 'r') as file: datas = [] for line in file.readlines(): row = line.rstrip('\n').split(',') array_row = [int(pix) for pix in row] datas.append(tuple(array_row)) size = int(math.sqrt(len(datas))) img = Image.new('RGB', (size, size), '#ffffff') k = 0 for i in range(size): for j in range(size): img.putpixel((i, j), datas[k]) k += 1 img.save("res.png") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铭记北宸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值