云曦期末考复现——crypto

 esay md5

 题目:(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)

云曦期末考复现——crypto_第1张图片

然后把得到的大写变成小写,外包flag

有趣的RSA

 费马分解法:

云曦期末考复现——crypto_第2张图片 

 

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())

 

 easyAES

第一次碰到AES。。

题目给了以一个passware.txt文档,里面打开全是AB。

一开始没什么思绪,后来查到AB可以转换成摩斯密码。

但是都是换行,当时是拿AI帮我把换行全都去了。后来看到师兄给的wp里面说可以通过16进制编辑器将换行符的16进制编码0A删掉进行解密或者用/来做分隔符云曦期末考复现——crypto_第3张图片

在010中打开

云曦期末考复现——crypto_第4张图片

 

把换行替换成\

 云曦期末考复现——crypto_第5张图片

 使用工具CaptEncoder莫斯解码。。

这个当时我是拿脚本跑的,替换成摩斯密码之后再进行摩斯密码解码。这个工具可以直接进行解码云曦期末考复现——crypto_第6张图片

 解码得到最后看到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)

云曦期末考复现——crypto_第7张图片 

 

你可能感兴趣的:(算法)