Buuctf Crypto

MD5

一个网站https://www.cmd5.com/,md5在线加密解密

丢失的md5

打开是一个python文件

 

允许后让我们先编码在hash

那么显然就是对字符串进行编码

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'.encode("utf-8")+chr(i).encode("utf-8")+'O3RJMV'.encode("utf-8")+chr(j).encode("utf-8")+'WDJKX'.encode("utf-8")+chr(k).encode("utf-8")+'ZM'.encode("utf-8"))
            des=m.hexdigest()
            if 'e9032' in des and 'da' in des and '911513' in des:
                print(des)

跑一下即可

大帝的密码武器

给了一个名字叫zip的文件,显然是解压打开,得到两个文件

 

还有一个密文

 

ok,那就是从第一个文件推出解密方式

首先大帝密码,那肯定就是凯撒大帝

那就写个脚本跑一下看看

a="FRPHEVGL"
a=a.lower()
for j in range(26):
    str=""
    for i in a:
        if ord(i)+j > 122:
            str+=chr(ord(i)+j-26)
        else:
            str+=chr(ord(i)+j)
    print(str)

题目说有意义的内容,翻找一下,第十三个单词是security

那么显然就是在字母表中右移13位

a="ComeChina"
str=""
for i in a:
    if ord(i)+13 > 122:
         str+=chr(ord(i)+13-26)
    else:
        str+=chr(ord(i)+13)
print(str)

Windows系统密码

 

ok,看不懂,不知道什么加密,

 

那么我们可以分析一下ctf这串内容,明显很像MD5

 

传统知识+古典密码

 

unencode --》uuencode

http://www.hiencode.com/uu.html

还原大师

 

md5爆破

import hashlib
#print hashlib.md5(s).hexdigest().upper()
k = 'TASC?O3RJMV?WDJKX?ZM'
for i in range(26):
    temp1 = k.replace('?',str(chr(65+i)),1) #用ascii开始,从A开始查
    for j in range(26):
        temp2 = temp1.replace('?',chr(65+j),1)
        for n in range(26):
            temp3 = temp2.replace('?',chr(65+n),1)
            s = hashlib.md5(temp3.encode('utf8')).hexdigest().upper()#注意大小写
            if s[:4] == 'E903':#检查元素
                print(s)

信息化时代的步伐

根据提示猜测中文电码编码

 

权限获得第一步

Administrator:500:806EDC27AA52E314AAD3B435B51404EE:F4AD50F57683D4260DFD48AA351A17A8:::

尝试hex,base都不是,再仔细分析串的模样,发现最大字母不超过f,那可能是MD5

测试发现解密成功

 

词频分析

世上无难事

首先给出文件

VIZZB IFIUOJBWO NVXAP OBC XZZ UKHVN IFIUOJBWO HB XVIXW XAW VXFI X QIXN VBD KQ IFIUOJBWO WBKAH NBWXO VBD XJBCN NKG QLKEIU DI XUI VIUI DKNV QNCWIANQ XN DXPIMKIZW VKHV QEVBBZ KA XUZKAHNBA FKUHKAKX XAW DI VXFI HBN QNCWIANQ NCAKAH KA MUBG XZZ XEUBQQ XGIUKEX MUBG PKAWIUHXUNIA NVUBCHV 12NV HUXWI XAW DI XUI SCQN QB HZXW NVXN XZZ EBCZW SBKA CQ NBWXO XAW DI DXAN NB NVXAP DXPIMKIZW MBU JIKAH QCEV XA BCNQNXAWKAH VBQN HKFI OBCUQIZFIQ X JKH UBCAW BM XLLZXCQI XAW NVI PIO KQ 640I11012805M211J0XJ24MM02X1IW09

挺茫然的,搜一下,词频分析

再看提示

找到key,key为32位

可以发现,最后一长串是32位,且pio刚好三位对应key,那就尝试

 

old-fashion

Os drnuzearyuwn, y jtkjzoztzoes douwlr oj y ilzwex eq lsdexosa kn pwodw tsozj eq ufyoszlbz yrl rlufydlx pozw douwlrzlbz, ydderxosa ze y rlatfyr jnjzli; mjy gfbmw vla xy wbfnsy symmyew (mjy vrwm qrvvrf), hlbew rd symmyew, mebhsymw rd symmyew, vbomgeyw rd mjy lxrzy, lfk wr dremj. Mjy eyqybzye kyqbhjyew mjy myom xa hyedrevbfn lf bfzyewy wgxwmbmgmbrf. Wr mjy dsln bw f1_2jyf-k3_jg1-vb-vl_l

扔入https://quipqiup.com/即可

总结

当遇上给的一段奇奇怪怪的文字,可以扔入词频分析尝试

RSAROLL

 

另外一个当不存在即可

题目说明RSA,那么第一行给出的{920139713,19},就假设为n,e,然后每一行当成密文去解密

from Crypto.Util.number import inverse

n = 920139713
e = 19
p = 18443
q = 49891
d = inverse(e, (p - 1) * (q - 1))

result = []
with open("D:\PyCharm 2022.2.1\projiect\crypto\题目文件\data.txt", 'rb') as f:
    for line in f.readlines():
        line = line.strip()
        result.append(chr(pow(int(line), d, n)))
for i in result:
    print(i,end='')

最后得到flag

[BJDCTF2020]这是base??

直接把python里base64的表改成题目要求的,然后正常解就好了:

import base64
import string
str1='FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw'
string1='JKLMNOxyUVzABCDEFGH789PQIabcdefghijklmWXYZ0123456RSTnopqrstuvw+/'
string2='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
print(base64.b64decode(str1.translate(str.maketrans(string1,string2))))

[WUSTCTF2020]佛说:只能四天

尊即寂修我劫修如婆愍闍嚤婆莊愍耨羅嚴是喼婆斯吶眾喼修迦慧迦嚩喼斯願嚤摩隸所迦摩吽即塞願修咒莊波斯訶喃壽祗僧若即亦嘇蜜迦須色喼羅囉咒諦若陀喃慧愍夷羅波若劫蜜斯哆咒塞隸蜜波哆咤慧聞亦吽念彌諸嘚嚴諦咒陀叻咤叻諦缽隸祗婆諦嚩阿兜宣囉吽色缽吶諸劫婆咤咤喼愍尊寂色缽嘚闍兜阿婆若叻般壽聞彌即念若降宣空陀壽愍嚤亦喼寂僧迦色莊壽吽哆尊僧喼喃壽嘚兜我空所吶般所即諸吽薩咤諸莊囉隸般咤色空咤亦喃亦色兜哆嘇亦隸空闍修眾哆咒婆菩迦壽薩塞宣嚩缽寂夷摩所修囉菩阿伏嘚宣嚩薩塞菩波吶波菩哆若慧愍蜜訶壽色咒兜摩缽摩諦劫諸陀即壽所波咤聞如訶摩壽宣咤彌即嚩蜜叻劫嘇缽所摩闍壽波壽劫修訶如嚩嘇囉薩色嚤薩壽修闍夷闍是壽僧劫祗蜜嚴嚩我若空伏諦念降若心吽咤隸嘚耨缽伏吽色寂喃喼吽壽夷若心眾祗喃慧嚴即聞空僧須夷嚴叻心願哆波隸塞吶心須嘇摩咤壽嘚吶夷亦心亦喃若咒壽亦壽囑囑

根据提示明显的佛与论禅

平等文明自由友善公正自由诚信富强自由自由平等民主平等自由自由友善敬业平等公正平等富强平等自由平等民主和谐公正自由诚信平等和谐公正公正自由法治平等法治法治法治和谐和谐平等自由和谐自由自由和谐公正自由敬业自由文明和谐平等自由文明和谐平等和谐文明自由和谐自由和谐和谐平等和谐法治公正诚信平等公正诚信民主自由和谐公正民主平等平等平等平等自由和谐和谐和谐平等和谐自由诚信平等和谐自由自由友善敬业平等和谐自由友善敬业平等法治自由法治和谐和谐自由友善公正法治敬业公正友善爱国公正民主法治文明自由民主平等公正自由法治平等文明平等友善自由平等和谐自由友善自由平等文明自由民主自由平等平等敬业自由平等平等诚信富强平等友善敬业公正诚信平等公正友善敬业公正平等平等诚信平等公正自由公正诚信平等法治敬业公正诚信平等法治平等公正友善平等公正诚信自由公正友善敬业法治法治公正公正公正平等公正诚信自由公正和谐公正平等

显然的社会主义价值观

RLJDQTOVPTQ6O6duws5CD6IB5B52CC57okCaUUC3SO4OSOWG3LynarAVGRZSJRAEYEZ_ooe_doyouknowfence

提示我们栅栏

再根据题目四天,猜测分组为4

但是栅栏存在两种形式,一一测试

最后普通形式的

R5UALCUVJDCGD63RQISZTBOSO54JVBORP5SAT2OEQCWY6CGEO53Z67L_doyouknowCaesar

ok是凯撒了

但是题目说了凯撒不是最后一步,但又没有已知信息去推凯撒解密

那么仔细分析串,都是大写字母和数字,凯撒正常变换是字母循环不会更改大小写,那么凯撒解密后依旧是大写,那么可能是base32,那就将wctf去base32解密,然后代入凯撒即可

 

在base32解密wctf2020{ni_hao_xiang_xiang_da_wo}

[HDCTF2019]bbbbbbrsa

给了文件

p = 177077389675257695042507998165006460849 n = 37421829509887796274897162249367329400988647145613325367337968063341372726061 c = ==gMzYDNzIjMxUTNyIzNzIjMyYTM4MDM0gTMwEjNzgTM2UTN4cjNwIjN2QzM5ADMwIDNyMTO4UzM2cTM5kDN2MTOyUTO5YDM0czM3MjM

给了脚本

from base64 import b64encode as b32encode
from gmpy2 import invert,gcd,iroot
from Crypto.Util.number import *
from binascii import a2b_hex,b2a_hex
import random

flag = "******************************"

nbit = 128

p = getPrime(nbit)
q = getPrime(nbit)
n = p*q

print p
print n

phi = (p-1)*(q-1)

e = random.randint(50000,70000)

while True:
    if gcd(e,phi) == 1:
        break;
    else:
        e -= 1;

c = pow(int(b2a_hex(flag),16),e,n)

print b32encode(str(c))[::-1]

# 2373740699529364991763589324200093466206785561836101840381622237225512234632

解密脚本

因为e是(50000,70000)随机的,所以爆破即可

import binascii
import random

from Crypto.Util.number import inverse
from gmpy2 import gcd, mpz

c = 2373740699529364991763589324200093466206785561836101840381622237225512234632
p = 177077389675257695042507998165006460849
n = 37421829509887796274897162249367329400988647145613325367337968063341372726061
q = n // p
phi = (p - 1) * (q - 1)
for e in range(50000, 70000):
    while True:
        if gcd(mpz(e), mpz(phi)) == 1:
            break
        else:
            e -= 1
    d = inverse(e, (p - 1) * (q - 1))
    m = pow(c, d, n)
    f1 = hex(m)[2:]
    if(len(str(f1)))%2==1:
        f1 = '0' + f1
    f2 = binascii.unhexlify(f1)
    if 'flag{' in str(f2):
        print(f2)

[MRCTF2020]天干地支+甲子

 

 

提取得11 51 51 40 46 51 38

显然不像,仔细思考60年一甲子为一循环,都加60

71 111 111 100 106 111 98

Goodjob

[ACTF新生赛2020]crypto-rsa0

说了伪加密,使用010打开压缩包,然后将14 00 后面均改成0即可.............

[NPUCTF2020]这是什么觅🐎

 

 

[NCTF2019]babyRSA

给了一个加密脚本,其中给出了edc,那么我们就要想办法去求pq

from Crypto.Util.number import *
from flag import flag

def nextPrime(n):
    n += 2 if n & 1 else 1
    while not isPrime(n):
        n += 2
    return n

p = getPrime(1024)
q = nextPrime(p)
n = p * q
e = 0x10001
d = inverse(e, (p-1) * (q-1))
c = pow(bytes_to_long(flag.encode()), e, n)

# d = 19275778946037899718035455438175509175723911466127462154506916564101519923603308900331427601983476886255849200332374081996442976307058597390881168155862238533018621944733299208108185814179466844504468163200369996564265921022888670062554504758512453217434777820468049494313818291727050400752551716550403647148197148884408264686846693842118387217753516963449753809860354047619256787869400297858568139700396567519469825398575103885487624463424429913017729585620877168171603444111464692841379661112075123399343270610272287865200880398193573260848268633461983435015031227070217852728240847398084414687146397303110709214913
# c = 5382723168073828110696168558294206681757991149022777821127563301413483223874527233300721180839298617076705685041174247415826157096583055069337393987892262764211225227035880754417457056723909135525244957935906902665679777101130111392780237502928656225705262431431953003520093932924375902111280077255205118217436744112064069429678632923259898627997145803892753989255615273140300021040654505901442787810653626524305706316663169341797205752938755590056568986738227803487467274114398257187962140796551136220532809687606867385639367743705527511680719955380746377631156468689844150878381460560990755652899449340045313521804

显然是根据d去求pq,但是怎么求呢

已知ed和n相关的式子只有

d = e^-1 mod (p-1)*(q-1)
=> ed = 1 mod (p-1)*(q-1)
=> ed-1 = k*(p-1)*(q-1)
显然ed-1,可以计算出是2066位
而pq已知都是1024位
那么(p-1)*(q-1)得到的结构就是2048位
那么k只能在15位到16位之间
即2^15~2^16
那就可以去写脚本爆破

------------------------------------------
再去分析脚本
首先prevprime函数是求出在传入参数内最大的素数
那么就很好理解了
pq本身是两个相邻的素数,其中p小于q
所以呢,我们就可以先将(p-1)*(q-1)这个结果看成一个数的次方
所以就可以对(ed-1)/k的结果开次方
然后代入prevprime求出p,然后传入nextPrime求出q
import binascii

import gmpy2
import sympy
from Crypto.Util.number import getPrime, isPrime

c = 5382723168073828110696168558294206681757991149022777821127563301413483223874527233300721180839298617076705685041174247415826157096583055069337393987892262764211225227035880754417457056723909135525244957935906902665679777101130111392780237502928656225705262431431953003520093932924375902111280077255205118217436744112064069429678632923259898627997145803892753989255615273140300021040654505901442787810653626524305706316663169341797205752938755590056568986738227803487467274114398257187962140796551136220532809687606867385639367743705527511680719955380746377631156468689844150878381460560990755652899449340045313521804
d = 19275778946037899718035455438175509175723911466127462154506916564101519923603308900331427601983476886255849200332374081996442976307058597390881168155862238533018621944733299208108185814179466844504468163200369996564265921022888670062554504758512453217434777820468049494313818291727050400752551716550403647148197148884408264686846693842118387217753516963449753809860354047619256787869400297858568139700396567519469825398575103885487624463424429913017729585620877168171603444111464692841379661112075123399343270610272287865200880398193573260848268633461983435015031227070217852728240847398084414687146397303110709214913
e = 0x10001


def nextPrime(n):
    n += 2 if n & 1 else 1
    while not isPrime(n):
        n += 2
    return n

e_d = e*d-1
p = 0
q = 0

for k in range(pow(2, 15), pow(2, 16)):
    if e_d % k == 0:
        p = sympy.prevprime(gmpy2.iroot(e_d//k,2)[0])
        q = nextPrime(p)
        if (p-1)*(q-1)*k == e_d:
            break
m = gmpy2.powmod(c,d,p*q)
print(binascii.unhexlify(hex(m)[2:]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值