2018-MCTF-CRYPTO - ZhouYetao

2018-MCTF-CRYPTO

密码学的题,这次也都是最基础的题,除了RSA有些难度需要理解之外,其他的都是最基础的古典密码

首先看到“#”,就想到了栅栏密码,看到密码是“TWhMRUNlTHBUZV99RnBze19sc2FF”,很明显的基加密,解密之后得到“MhLECeLpTe_} Fps {_lsaE”,这边已经有点旗的格式了,所以直接百度栅栏在线解密,给出在线解密的网址
在线解密网址

不过具体的栏数是要自己去凑的;

他妈的

首先给出密码:++++++++++++++++ ++++++++++++++++++++++++++++ --- - 。<。+ ++ ++++ [ - > ++ ++++++] + ++ ++。+ + + + + + [ - > - ---- <]>。 <+ +++ [ - > ++++ <]> + .----- - 。<+ +++ [ - > ++++ <]> ++ +。<++++ [ - > ---- <]> --- - 。<+ ++++ [ - > --- - <]> ----。<++++ ++ [ - > ++++++ <]> +
++++++++++++++++++++++++++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + - ----- -----。<+++ ++++ [ - > +++ ++++]> +++ +++++++++++++++++ ---。<+++++ ++ [ - > ------- <]> ----- ----- - .. <+ +++++ ++ [ - > +++++ +++ <]> +。<+ +++ [ - > ++++ <]> ++。<

这个也是一种常见密码的一种,brainfuck密码,也是直接给出在线解密网站
在线解密网址

D..Delicious

密码:ABBAAAAABABAABBAABABAAAABAAAAAAAABAABBBAABBABABAAABAABAAAABBAABAAABABBABAAAAAABAABAAAABBBABABAABAABA

看到只有AB的密码格式应该要联想到至少两个密码 - 一个是莫斯密码,还有一个就是培根密码,根据题目美味知道这题应该是培根密码,还是一样,给出在线解密网址
在线解密

自己加上{}提交就确定,不过在这题好像出题人有个失误,就是MCTF要小写才能提交......
滴滴答答

滴滴答答,明显的莫斯密码,这里给出摩斯密码的在线解密网站
在线解密

不过题目给的是音频,所以这个题目是一个典型的音频隐写,这边推荐下载的Audacity的这个软件,当然也是需要学习一下有关音频隐写的相关知识
https://blog.csdn.net/pdsu161530247/article/details/77568807这个上面对于周大福的MP3隐写介绍的还是比较详细的,在第一次查看声道的时候,发现下面的声道是很明显的莫斯,不过我好不容易一个一个打下来,再翻译出来,结果发现这个不是题目的标志,不过可以给大家分享一下具体的内容和解出来的意思:
。.... - ..- ..- - .- ..- - ... - ... - 。 - .. .. - .. - 。 - .... --- - .... .- ..-- .- - .--
明文:莫尔斯代码是一种传输文本信息的方法,作为一系列关闭的光源或点击,可以由没有特殊设备的熟练的听众或观察者直接理解它被称为SAMUELF.B.MORSE电信的发明者。 
但是标志不是你可以用其他方式找到的

结果发现这个是出题人用来调戏我们的一个东西,这次的出题人很是坏,不要和他们学习.......

当然这也说明这样的方法是不对的,需要换个方向去研究,这次的方向是查看这段声音的频谱图:

嗯,这次终于发现了标记的消息,就是再最后的这串莫斯,

密码:。 - .. - --- .- .......

明文:EZMORSE

这个出题人还是有个问题就是提交的时候是要提交明文的小写格式,这个上我也是当时被坑了很久......

这是啥

这个开始的时候给了一串数字,这个一看就是ASCII,所以也就直接写个脚本进行解密就OK了,给出脚本如下:

a=[77,67,84,70,123,84,104,73,51,95,97,115,99,49,49,95,69,110,99,111,100,51,125]
flag=""
for i in range (len(a)):
flag+=chr(a[i])
print flag

也就确定了这个题;

讲完了之前的一些古典密码,虽然都是给了一些在线解密的网址,但是大家最好还是要去了解一下这些密码的一些原理,这样再比赛的时候,有时候是断网的,这样才可以很好的进行解密;

接下来讲的就是这期比赛中相对比较难的一些密码题,也就是RSA密码,具体的RSA密码大家可以去参照这个网站

https://altman.vip/2018/07/23/RSA-STUDY/#0x02-wiener-attack

这上面关于这次的比赛的RSA的题型都涉及了,接下来就给出具体的脚本

RSA1

#!/usr/bin/env python
# encoding: utf-8
from pwn import *
from struct import pack, unpack
import zlib
import gmpy2

p=remote("120.78.84.189 ",9998)

p.sendline("1")
p.recvuntil("[N]: ")
N=p.recvuntil("L",drop=True)
N=int(N,16)
print "N="+str(N)

p.recvuntil("[E]: ")
E=p.recvuntil("\n",drop=True)
E=int(E,16)
print "E="+str(E)

p.recvuntil("[C]: ")
C=p.recvuntil("L",drop=True)
C=int(C,16)
print "C="+str(C)
flag="Rivest_Shamir_Adleman"
p.sendline(flag)
print p.recv() 
p.interactive()

RSA2

#!/usr/bin/env python
# encoding: utf-8
 
from pwn import *
from struct import pack, unpack
import zlib
import gmpy2
 
def my_parse_number(number):
    string = "%x" % number
    #if len(string) != 64:
    #    return ""
    erg = []
    while string != '':
        erg = erg + [chr(int(string[:2], 16))]
        string = string[2:]
    return ''.join(erg)
 
p=remote("120.78.84.189 ",9998)
 
p.sendline("2")
p.recvuntil("[N]: ")
N=p.recvuntil("L",drop=True)
N=int(N,16)
print "N="+str(N)
 
p.recvuntil("[E]: ")
E=p.recvuntil("\n",drop=True)
E=int(E,16)
print "E="+str(E)
 
p.recvuntil("[C]: ")
C=p.recvuntil("L",drop=True)
C=int(C,16)
print "C="+str(C)
 
i = 0
while True:
    if gmpy2.iroot(C + i * N, 3)[1] == True:
        print "Success!"
        m=gmpy2.iroot(C + i * N, 3)
        print m
        break
    i += 1
# m=440721643740967258786371951429849843897639673893942371730874939742481383302887786063966117819631425015196093856646526738786745933078032806737504580146717737115929461581126895844008044713461807791172016433647699394456368658396746134702627548155069403689581548233891848149612485605022294307233116137509171389596747894529765156771462793389236431942344003532140158865426896855377113878133478689191912682550117563858186L
#m=hex(m)[2:].replace("L","")
if (len(m) % 2 == 1):
    m= '0' + m
string=str(m)
flag=string[5:-8]
flaghex=hex(int(flag))
flagstr=my_parse_number(int(flag))
print "flag="+flag
print "flaghex="+str(flaghex)
print "m="+str(m)#.decode('hex')
print "flagstr="+flagstr
 
p.sendline(flagstr)
print p.recv()
 
p.interactive()

RSA3

#!/usr/bin/env python
# encoding: utf-8
 
from pwn import *
from struct import pack, unpack
from libnum import n2s,s2n
from gmpy2 import invert
import zlib
import gmpy2
import libnum
import codecs
 
def egcd(a, b):
  if a == 0:
    return (b, 0, 1)
  else:
    g, y, x = egcd(b % a, a)
    return (g, x - (b // a) * y, y)
 
def my_parse_number(number):
    string = "%x" % number
    #if len(string) != 64:
    #    return ""
    erg = []
    while string != '':
        erg = erg + [chr(int(string[:2], 16))]
        string = string[2:]
    return ''.join(erg)
 
p=remote("120.78.84.189 ",9998)
 
p.sendline("3")
p.recvuntil("[N]: ")
N=p.recvuntil("L",drop=True)
N=int(N,16)
print "N="+str(N)
 
p.recvuntil("[E1]: ")
E1=p.recvuntil("\n",drop=True)
E1=int(E1,16)
print "E1="+str(E1)
 
p.recvuntil("[E2]: ")
E2=p.recvuntil("\n",drop=True)
E2=int(E2,16)
print "E2="+str(E2)
 
p.recvuntil("[C1]: ")
C1=p.recvuntil("L",drop=True)
C1=int(C1,16)
print "C1="+str(C1)
 
p.recvuntil("[C2]: ")
C2=p.recvuntil("L",drop=True)
C2=int(C2,16)
print "C2="+str(C2)
 
s = egcd(E1, E2)
s1 = s[1]
s2 = s[2]
# 求模反元素
if s1<0:
    s1 = - s1
    C1 = invert(C1, N)
elif s2<0:
    s2 = - s2
    C2 = invert(C2, N)
m = pow(C1,s1,N)*pow(C2,s2,N) % N
flag=n2s(m)
print "flag="+flag
 
p.sendline(flag)
print p.recv()
 
p.interactive()

Leave a Comment

@author:ZhouYetao
© 2020 Copyright.  | Power by Mijiu                                                                                               
本站已安全运行 873 天