题目:(flag就是mw进行md5加密后的值,告诉了你mw前面几位,flag前面几位)
MW='Python_MD5****'
flag=MD5(MW)
print(flag)
#ca5c8967fce365cd2e79ba086d******
网上找了个差不多的md5碰撞的脚本改了改
一开始一直没对,因为给的s的前26位必须是大写
import hashlib
k = 'Python_MD5????' #要还原的明文
for i in range(58):
temp1 = k.replace('?',str(chr(65+i)),1)
for j in range(58):
temp2 = temp1.replace('?',chr(65+j),1)
for n in range(58):
temp3 = temp2.replace('?',chr(65+n),1)
for p in range(58):
temp4 = temp3.replace('?',chr(65+p),1)
s = hashlib.md5(temp4.encode('utf8')).hexdigest().upper()#注意大小写
if s[:26] == 'CA5C8967FCE365CD2E79BA086D':#检查元素
print(s)
然后把得到的大写变成小写,外包flag
import libnum //新下载的库。。。这个库包括了一些常见的数字操作,如质数检测、GCD计算、模反演、RSA加密和解密等。
import gmpy2
from Crypto.PublicKey import RSA
def isqrt(n): //求整数平方根。通过牛顿迭代法来逼近整数平方根,通过不断地逼近x和y的平均值来逼近整数平方根。在每次迭代中都将x更新为y,y更新为(x+n//x)//2,直到y>=x为止。最后返回x作为整数平方根
x = n
y = (x + n // x) // 2
while y < x:
x = y
y = (x + n // x) // 2
return x
def fermat(n, verbose=True): //定义fermat函数,使用费马分解法将公钥分解为其两个质数因子p和q
a = isqrt(n) # int(ceil(n**0.5))
b2 = a*a - n
b = isqrt(n) # int(b2**0.5)
count = 0
while b*b != b2:
# if verbose:
# print('Trying: a=%s b2=%s b=%s' % (a, b2, b))
a = a + 1
b2 = a*a - n
b = isqrt(b2) # int(b2**0.5)
count += 1
p=a+b
q=a-b
assert n == p * q
# print('a=',a)
# print('b=',b)
# print('p=',p)
# print('q=',q)
# print('pq=',p*q)
return p, q
with open("pub.key","rb") as f: //读取公钥文件“pub.key”并从中提取n和e
key = RSA.import_key(f.read())
n=key.n
e=key.e
with open("m","rb") as f: //读取加密消息文件“m”,并将其转换为数字
c=f.read()
c=libnum.s2n(c) //libnum.s2n()将其转换为数字
n1=fermat(n)
p=n1[0]
q=n1[1]
phi_n=(p-1)*(q-1)
d=libnum.invmod(e,phi_n)
m=pow(c,d,n)
print(m)
print(libnum.n2s(int(m)).decode())
第一次碰到AES。。
题目给了以一个passware.txt文档,里面打开全是AB。
一开始没什么思绪,后来查到AB可以转换成摩斯密码。
但是都是换行,当时是拿AI帮我把换行全都去了。后来看到师兄给的wp里面说可以通过16进制编辑器将换行符的16进制编码0A删掉进行解密或者用/来做分隔符
在010中打开
使用工具CaptEncoder莫斯解码。。
这个当时我是拿脚本跑的,替换成摩斯密码之后再进行摩斯密码解码。这个工具可以直接进行解码
解码得到最后看到password是curry。。当时这题解出来但是不知道这是password。离谱
后面就把给的脚本修改一下,把key写入
from Crypto.Cipher import AES
import base64
def aes_decrypt(key, encrypted_text):
key_bytes = key.encode('utf-8')
key_bytes += b'\x00' * (16 - len(key_bytes) % 16) //将key转换为字节数组,并在其末尾添加0,使其长度为16的倍数。
# 使用AES解密
aes = AES.new(key_bytes, AES.MODE_ECB)
encrypted_bytes = base64.b64decode(encrypted_text.encode('utf-8')) //将encrypted_text解码为字节数组,并使用base64.b64decode函数将其解码为二进制数据
decrypted_bytes = aes.decrypt(encrypted_bytes).rstrip(b'\x00') //使用rstrip函数删除末尾的空字节
# 返回解密后的结果
return decrypted_bytes.decode('utf-8')
key = 'CURRY'
encrypted_text = 'mtIeCJMwg+YZ80NdXkp+hTxjwQvTlWy2fyrFBrTn+LdeUwufsDn0Bn3EHD1wT5KB'
decrypted_text = aes_decrypt(key, encrypted_text)
print('解密后的结果:', decrypted_text)