BUUCTF-Crypto刷题记录

0x01 MD5

题目:

e00cf25ad42683b3df678c61f42c6bda

做法: 去网站跑字典,得到原文为admin1 flag{admin1}

0x02 Url编码

题目:

%66%6c%61%67%7b%61%6e%64%20%31%3d%31%7d

做法: 用工具把16进制转换成文本,即可得到flag flag{and 1=1}

0x03 看我回旋踢

题目:

synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}

做法: 观察格式觉得很像flag的格式,对比发现f和s,l和y差的位数均为13,尝试脚本解码,得到flag flag{5cd1004d-86a5-46d8-b720-beb5ba0417e1}

#include<stdio.h>
#include<string.h>
int main() {
  char a[50]="synt{5pq1004q-86n5-46q8-o720-oro5on0417r1}";
  for(int i=0;i<strlen(a);i++)
    if(a[i]>='a'&&a[i]<='z')
      a[i]=a[i]-13;
  printf("%s",a);
}

0x04 一眼就解密

题目:

ZmxhZ3tUSEVfRkxBR19PRl9USElTX1NUUklOR30=

做法: 直接Base64解密,得到flag flag{THE_FLAG_OF_THIS_STRING}

0x05 摩丝

题目:

.. .-.. --- ...- . -.-- --- ..-

做法: 进行摩斯电码转换得到ILOVEYOU flag{ILOVEYOU}

0x06 BJDCTF-签到

题目:

QkpEe1czbGMwbWVfVDBfQkpEQ1RGfQ==

做法: 直接base64解密,得到BJD{W3lc0me_T0_BJDCTF} flag{W3lc0me_T0_BJDCTF}

0x07 password

题目:

姓名:张三 
生日:19900315
key格式为key{xxxxxxxxxx}

做法: 直接缩写,感觉智商不够用了。。 flag{zs19900315}

0x08 变异凯撒

题目:

加密密文:afZ_r9VYfScOeO_UL^RWUc
格式:flag{ }

做法: 根据给出的格式判断前四位的值对应flag,算出第一位偏移了5位,第二位偏移了6位,第三位偏移了7位,所以开始写脚本,得到flag flag{Caesar_variation}

#include<stdio.h>
#include<string.h>
int main() {
  int k=5;
  char a[30]="afZ_r9VYfScOeO_UL^RWUc";
  for(int i=0;i<strlen(a);i++){
    a[i]=a[i]+k;
    k++;
  }
  printf("%s",a);
  return 0;
}

0x09 Quoted-printable

题目:

=E9=82=A3=E4=BD=A0=E4=B9=9F=E5=BE=88=E6=A3=92=E5=93=A6

做法: 在网站选择UTF-8进行解码,得到那你也很棒哦 flag{那你也很棒哦}

0x0A Rabbit

题目:

U2FsdGVkX1/+ydnDPowGbjjJXhZxm2MP2AgI

做法: 根据题目提示为Rabbit加密,到网站解密即可得到Cute_Rabbit, 尝试其他Rabbit加密发现均是U2FsdGVkX1开头,以后遇到类似的可以去试试 flag{Cute_Rabbit}

0x0B RSA

题目:

在一次RSA密钥对生成中,假设p=473398607161,q=4511491,e=17,求解出d作为flag提交

做法: 首先了解下RSA加密的原理:

由此得出脚本,解得d=125631357777427553 flag{125631357777427553}

p = 473398607161
q = 4511491
e = 17
phi = (p-1)*(q-1)
k = 0
# de=1+phi*k,i为正数,'//'除法向上取整
while True:
    if((phi*k+1)%e == 0):
        break;
    k+=1
d = (phi*k+1)//e
print(d)
import gmpy2
p = 473398607161
q = 4511491
e = 17
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
print(d)

0x0C 篱笆墙的影子

题目:

felhaagv{ewtehtehfilnakgw}

做法: 看到熟悉的flag{},然后发现相隔1位,觉得是栅栏密码,一共26个字符,分成2组,进行栅栏解码得到flag flag{wethinkwehavetheflag}

e="felhaagv{ewtehtehfilnakgw}"elen=len(e) #计算字符长field=[]for i in range(2,elen):    if(elen%i==0):        field.append(i)for f in field:    b=elen//f #用字长除以上面计出能除的数字    result={x:'' for x in range(b)}    for i in range(elen):        a=i%b;        result.update({a:result[a]+e[i]}) #字符串断,update新数据    d=''    for i in range(b):        d=d+result[i]    print('分为'+str(f)+'栏时,解密结果为: '+d+'\n')

0x0D 丢失的md5

题目:

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')
            des=m.hexdigest()
            if 'e9032' in des and 'da' in des and '911513' in des:
                print des

做法: 运行下py脚本即可得到e9032994dabac08080091151380478a2,无脑题 flag{e9032994dabac08080091151380478a2}

0x0E Alice与Bob

题目:

下面是一个大整数:98554799767,请分解为两个素数,
分解后,小的放前面,大的放后面,合成一个新的数字,
进行md5的32位小写哈希,提交答案。

做法: 用py脚本分解得到101999×966233,即101999966233, md5转换后得到d450209323a847c8d01c6be47c81811a flag{d450209323a847c8d01c6be47c81811a}

n = 98554799767
l = []
while n > 1:
    for i in range(2, n+1):
        if n % i == 0:
            n = n // i
            l.append(str(i))
            break
print ("×".join(l))

0x0F 老文盲了

题目:

罼雧締眔擴灝淛匶襫黼瀬鎶軄鶛驕鳓哵眔鞹鰝

做法: 看到这...没心态,觉得是UTF-8中文的乱码,没试出来,仔细看了下擴灝,是不是括号谐音,结合题目怀疑是认字有关的, 我没文化,就去网站查了下中文拼音,是bì jí dì dà kuò hào zhè jiù shì fǔ lài gē zhí jiē jiāo lè bā dà kuò hào , 换成中文bjd{这就是flag直接交了吧},不对,换了好多个都不行,最后来了个思路bjd{淛匶襫黼瀬鎶軄鶛驕鳓哵},成功了,我人傻了,我没文化。 flag{淛匶襫黼瀬鎶軄鶛驕鳓哵}

0x10 rsarsa

题目:

Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.
   
   p =  9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
   q =  11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
   e =  65537
   c =  83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
   
   Use RSA to find the secret message

做法: 首先了解下RSA加密的原理: 由此得出脚本,解得m=5577446633554466577768879988

import gmpy2
p = gmpy2.mpz(9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483)
q = gmpy2.mpz(11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407)
c = gmpy2.mpz(83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034)
#mpz(x)初始化大整数
e = 65537
n=p*q
phi = (p-1)*(q-1)
d = gmpy2.invert(e,phi)
m = pow(c,d,n)
#pow(x,y,z) x^y%z
print(m)

0x11 Windows系统密码

题目:

Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
ctf:1002:06af9108f2e1fecf144e2e8adef09efd:a7fcb22a88038f35a8f39d503e7f0062:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
SUPPORT_388945a0:1001:aad3b435b51404eeaad3b435b51404ee:bef14eee40dffbc345eeb3f58e290d56:::

做法: 根据题目搜了到一篇Windows密码的原理, 存储的密码hash是NTLM类型的,存储在第三个字段中,即a7fcb22a88038f35a8f39d503e7f0062,去网站跑字典,得到原文为good-luck flag{good-luck}

0x12 大帝的密码武器

题目:

公元前一百年,在罗马出生了一位对世界影响巨大的人物,他生前是罗马三巨头之一。他率先使用了一种简单的加密函,因此这种加密方法以他的名字命名。
密文`FRPHEVGL`被解开后可以获得一个有意义的单词,你可以用这个相同的加密向量加密ComeChina,作为答案进行提交。

做法: 纯字母和罗马伟大人物,判断是凯撒密码,当偏移量为13时,用脚本解得SECURITY,刚好是13位,所以加密和解密脚本都一样, 加密ComeChina得到PbzrPuvan flag{PbzrPuvan}

#include<stdio.h>
#include<string.h>
   int main() {
     char a[10]="ComeChina";int move=13;
     for(int i=0;i<strlen(a);i++){
           if(a[i]<='Z'){
             a[i]=a[i]+move;
             if(a[i]>'Z')
               a[i]=a[i]-26;
           }else{
             a[i]=a[i]+move;
             if(a[i]>'z')
               a[i]=a[i]-26;
           }}
     printf("%s",a);
   }

0x13 传统知识+古典密码

题目:

小明某一天收到一封密信,信中写了几个不同的年份
          辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳。
          信的背面还写有“+甲子”,请解出这段密文。

key值:CTF{XXX}

做法: 查了下辛卯,是干支的一种,排28位,加上+甲子,就是88,对应ASCII码是字母X,写脚本得出字符串XZSDMFLZ,当成flag提交发现不对, 纯英文的应该是凯撒密码,得,试了N次,没做出来,看别人题解是先栅栏得到XMZFSLDZ,再凯撒ROT21得到SHUANGYU,这就是flag flag{SHUANGYU}

a=[28,30,23,8,17,10,16,30]
for i in a:
    print(chr(i+60),end='')

0x14 cat_flag

题目: 文件链接 做法: 一打开就傻眼了。。得,80个格子。。把吃饭团的作为0,吃鸡腿的作为1,得到01000010010010100100010001111011010011010010000101100001001100000111111001111101 二进制转字符串得到BJD{M!a0~} flag{M!a0~}

0x15 燕言燕语-y1ng

题目:

小燕子,穿花衣,年年春天来这里,我问燕子你为啥来,燕子说:
79616E7A69205A4A517B78696C7A765F6971737375686F635F73757A6A677D20

做法: 直接16进制转字符串得到yanzi ZJQ{xilzv_iqssuhoc_suzjg},试了下发现不是flag,前面还有yanzi, 搜了下发现是维吉尼亚密码,密钥是yanzi,解密ZJQ{xilzv_iqssuhoc_suzjg}得到BJD{yanzi_jiushige_shabi},提供一个网站 flag{yanzi_jiushige_shabi}

0x16 小学生的密码学

题目:

e(x)=11x+6(mod26)
密文:welcylk,flag为base64形式

做法:

经过查询,这个题目是考察仿射密码的解密,其中公式为:

加密函数:E(x) = (ax + b)(mod m),其中a与b互质,m是编码系统中字母的个数。
解密函数:D(x) = a^(-1)(x - b)(mod m),其中 a^(-1)是a在Zm群的乘法逆元。

因为y≡11x+6(mod26)11*k≡1(mod26),解得k=19,即为a的乘法逆元。

所以x≡19(y-6)=19y-114≡19y+16(mod26),解得sorcery,base64编码得到c29yY2VyeQ==

flag{c29yY2VyeQ==}

#include<stdio.h>
#include<string.h>
int main(int argc, char const *argv[]) {
  char a[10]="welcylk";
  int x;
  for(int i=0;i<strlen(a);i++){
    x=(19*(a[i]-97)+16)%26+97;
    printf("%c",x);
  }
  return 0;
}

0x17 信息化时代的步伐

题目:

也许中国可以早早进入信息化时代,但是被清政府拒绝了。附件中是数十年后一位伟人说的话的密文。请翻译出明文(答案为一串中文) 
606046152623600817831216121621196386

做法:

看提示查了一下发现这里考察中文电码,即4位数字代表一个中文字符,到网站解码即可。解得计算机要从娃娃抓起

flag{计算机要从娃娃抓起}

0x18 凯撒?替换?呵呵!

题目:

MTHJ{CUBCGXGUGXWREXIPOYAOEYFIGXWRXCHTKHFCOHCFDUCGTXZOHIXOEOWMEHZO}
flag为小写字母

做法:

0x19 信息化时代的步伐

题目:

做法:

BUUCTF-Web刷题记录
2018年网鼎杯writeups
已开启邮件提醒回复功能