BUU Crypto[29-32]

本文介绍了几种密码学的解题思路,包括通过MD5码爆破还原明文,字符串异或解密,RSA加密的公钥解析及解密过程,以及RSA加密的数据处理。通过实例展示了如何运用编程技巧解决实际加密问题,涉及的关键技术包括哈希碰撞、异或运算、大数分解和RSA算法。
摘要由CSDN通过智能技术生成

还原大师

解题思路

明文:TASC?O3RJMV?WDJKX?ZM
MD5码:E903???4DAB???08???51?80??8A?

很明显一个爆破,通过残缺的MD5码进行筛选,exp如下:

import hashlib
for i in range(32,127):
    for j in range(32,127):
        for k in range(32,127):
            m=hashlib.md5()
            m.update(('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM').encode())
            des=m.hexdigest()
            if 'e9032' in des and 'da' in des and '911513' in des:
                print(des.upper())

得到flag:flag{E9032994DABAC08080091151380478A2}

总结

异性相吸

解题思路

依据题目推断,可能是对字符串之间进行异或,exp如下:

key = 'asadsasdasdasdasdasdasdasdasdasdqwesqf'
with open(r'./cipher.txt', 'r') as f:
    m = f.read()

c = ''
for i in range(len(key)):
    c += chr(ord(m[i]) ^ ord(key[i]))
print(c)

得到flag:flag{ea1bc0988992276b7f95b54a7435e89e}

总结

多从题目字眼推断考点,猜测出题人意思

RSA

解题思路

解析pub.key得到
N:8693448229604811919066606200349480058890565601720302561721665405
8378322103517
e:65537

然后分解N,查询factor.db得到N的分解:
p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463

接下来正常解密即可

import gmpy2
from Crypto.Util.number import *

p = 285960468890451637935629440372639283459
q = 304008741604601924494328155975272418463
N = 86934482296048119190666062003494800588905656017203025617216654058378322103517
e = 65537
d = gmpy2.invert(e,(p - 1) * (q - 1))
s = open("flag.enc","rb")
c= bytes_to_long(s.read())
m = pow(c,d,N)
print(long_to_bytes(m))

得到flag:flag{decrypt_256}

解题思路

通过公钥文件获取N和e,接下来和常规的一样,分解N再求 ϕ ( N ) \phi(N) ϕ(N)和d,最后求m即可
解析公钥文件方式:

RSAROLL

解题思路

data.txt:
{920139713,19}

704796792
752211152
274704164
18414022
368270835
483295235
263072905
459788476
483295235
459788476
663551792
475206804
459788476
428313374
475206804
459788476
425392137
704796792
458265677
341524652
483295235
534149509
425392137
428313374
425392137
341524652
458265677
263072905
483295235
828509797
341524652
425392137
475206804
428313374
483295235
475206804
459788476
306220148

看到后很懵逼,推测一下第一行是N和e,接下来的都是密文,分解N得到
p= 18443
q= 49891
常规解密发现前四行是f、l、a、g,所以最后应该是拼接起来就行了,exp:

import gmpy2
from Crypto.Util.number import long_to_bytes
list1=[704796792,
752211152,
274704164,
18414022,
368270835,
483295235,
263072905,
459788476,
483295235,
459788476,
663551792,
475206804,
459788476,
428313374,
475206804,
459788476,
425392137,
704796792,
458265677,
341524652,
483295235,
534149509,
425392137,
428313374,
425392137,
341524652,
458265677,
263072905,
483295235,
828509797,
341524652,
425392137,
475206804,
428313374,
483295235,
475206804,
459788476,
306220148]
flag=""
n=920139713
q=18443
p=49891
e=19
for i in list1:
	c=i
	d = gmpy2.invert(e, (p - 1) * (q - 1))
	m = pow(c, d, n)
	string = long_to_bytes(m)
	flag+=string.decode()
print(flag)

得到flag:flag{13212je2ue28fy71w8u87y31r78eu1e2}

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值