密码挑战—真·Beginner

该文章介绍了一个CTF解密题目,涉及对文件flag.txt的内容进行加解密操作。题目要求通过计算给定条件下的逆元来解密数据,利用了模运算和gmpy2库。最终,文章展示了如何运用逆元理论求解原数值并解密出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x00 前言

CTF 加解密合集:CTF 加解密合集

0x01 题目

assert(len(open('flag.txt', 'rb').read()) <= 50)
assert(str(int.from_bytes(open('flag.txt', 'rb').read(), byteorder='big') << 10000).endswith('1002773875431658367671665822006771085816631054109509173556585546508965236428620487083647585179992085437922318783218149808537210712780660412301729655917441546549321914516504576'))

0x02 Write Up

开始解题,这道题拆解,首先是得到末尾的175位

a%10^175即可。那么算法就是m*2^10000%10^175=c,现在就是要求m的值。根据逆元的特性

bb’≡1(mod N)

公式两边同时乘以2^10000的逆元,我们这里简化为b

可以得到m*%10^175%10^175=c*b'

根据同余继续化简:
m=c*b'%10^175

那么就可以求解:

c=1002773875431658367671665822006771085816631054109509173556585546508965236428620487083647585179992085437922318783218149808537210712780660412301729655917441546549321914516504576
import gmpy2
mod=pow(5,175)
f=gmpy2.invert(pow(2,10000),mod)
from Crypto.Util.number import *
m=c*f%mod
print(long_to_bytes(m))

以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值