攻防世界-密码学-新手练习区

1. Caeser

凯撒密码:替换加密——明文中的所有字母都在字母表上向后按照一个固定数目offset进行偏移后被替换成密文。由于不知道偏移量,因此将每个偏移量都试一下进行解密;事实上,解密过程既可以看作密文中的所有字母都在字母表上向前按照一个固定数目offset进行偏移,也可以看作密文中的所有字母都在字母表上向后按照一个固定数目(26-offset)进行偏移!

如下是解题的Python代码:

from string import lowercase

class Caeser():
    def __init__(self,dic=None):
        if dic==None:
            self.dic=lowercase
        else:
            self.dic=dic

    def enc(self,msg,ofst):
        dic=self.dic
        ld=len(dic)
        cip=''
        for c in msg:
            if c in dic:
                index=dic.find(c)
                cip+=dic[(index+ofst)%ld]
            else:
                cip+=c
        return cip

def solve():
    msg='oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}'
    caeser=Caeser()
    for ii in range(len(caeser.dic)):
        print caeser.enc(msg,ii)

if __name__=='__main__':
    solve()

运行上述程序:

$ python wp1.py
oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz}
plorecrnpr{lbh_unir_yrnearq_pnrfne_rapelcgvba}
qmpsfdsoqs{mci_vojs_zsofbsr_qosgof_sbqfmdhwcb}
rnqtgetprt{ndj_wpkt_atpgcts_rpthpg_tcrgneixdc}
soruhfuqsu{oek_xqlu_buqhdut_squiqh_udshofjyed}
tpsvigvrtv{pfl_yrmv_cvrievu_trvjri_vetipgkzfe}
uqtwjhwsuw{qgm_zsnw_dwsjfwv_uswksj_wfujqhlagf}
vruxkixtvx{rhn_atox_extkgxw_vtxltk_xgvkrimbhg}
wsvyljyuwy{sio_bupy_fyulhyx_wuymul_yhwlsjncih}
xtwzmkzvxz{tjp_cvqz_gzvmizy_xvznvm_zixmtkodji}
yuxanlawya{ukq_dwra_hawnjaz_ywaown_ajynulpekj}
zvybombxzb{vlr_exsb_ibxokba_zxbpxo_bkzovmqflk}
awzcpncyac{wms_fytc_jcyplcb_aycqyp_clapwnrgml}
bxadqodzbd{xnt_gzud_kdzqmdc_bzdrzq_dmbqxoshnm}
cyberpeace{you_have_learned_caesar_encryption}
dzcfsqfbdf{zpv_ibwf_mfbsofe_dbftbs_fodszqujpo}
eadgtrgceg{aqw_jcxg_ngctpgf_ecguct_gpetarvkqp}
fbehushdfh{brx_kdyh_ohduqhg_fdhvdu_hqfubswlrq}
gcfivtiegi{csy_lezi_pievrih_geiwev_irgvctxmsr}
hdgjwujfhj{dtz_mfaj_qjfwsji_hfjxfw_jshwduynts}
iehkxvkgik{eua_ngbk_rkgxtkj_igkygx_ktixevzout}
jfilywlhjl{fvb_ohcl_slhyulk_jhlzhy_lujyfwapvu}
kgjmzxmikm{gwc_pidm_tmizvml_kimaiz_mvkzgxbqwv}
lhknaynjln{hxd_qjen_unjawnm_ljnbja_nwlahycrxw}
milobzokmo{iye_rkfo_vokbxon_mkockb_oxmbizdsyx}
njmpcaplnp{jzf_slgp_wplcypo_nlpdlc_pyncjaetzy}

看上去像句人话的就是cyberpeace{you_have_learned_caesar_encryption},这就是flag。

2. Morse

摩尔斯密码:使用0,1两种状态的二进制代码组合表示字母与数字;解密就是一个查找操作。如下是解题的Python代码:

#Morse Code

class Morse():
    def __init__(self):
        self.dic = {'a': '01',     'b': '1000',   'c': '1010',
                'd': '100',    'e': '0',      'f': '0010',
                'g': '110',    'h': '0000',   'i': '00',
                'j': '0111',   'k': '101',    'l': '0100',
                'm': '11',     'n': '10',     'o': '111',
                'p': '0110',   'q': '1101',   'r': '010',
                's': '000',    't': '1',      'u': '001',
                'v': '0001',   'w': '011',    'x': '1001',
                'y': '1011',   'z': '1100',   '_': '001101',
                '0': '11111',  '1': '01111',  '2': '00111',
                '3': '00011',  '4': '00001',  '5': '00000',
                '6': '10000',  '7': '11000',  '8': '11100',
                '9': '11110'
                }

    def enc(self,msg):
        cip=''
        dic=self.dic
        for c in msg:
            cip+=dic[c]
            cip+=''
        return cip

    def dec(self,cip):
        msg=''
        dic=self.dic
        key=list(dic.keys())
        val=list(dic.values())
        for c in cip.split():
            msg+=key[val.index(c)]
        return msg

def solve():
    cip='11 111 010 000 0 1010 111 100 0 00 000 000 111 00 10 1 0 010 0 000 1 00 10 110'
    morse=Morse()
    print morse.dec(cip)

if __name__=='__main__':
#   python wp2.py
    solve()

运行上述程序:

$ python wp2.py
morsecodeissointeresting

3. 不仅仅是Morse

由于得到的数据格式与上一个相同,因此仍然进行Morse解密,解密出

may_be_have_another_decodehhhhaaaaabaabbbaabbaaaaaaaabaababaaaaaaabbabaaabbaaabbaabaaaababaabaaabbabaaabaaabaababbaabbbabaaabababbaaabbabaaabaabaabaaaabbabbaabbaabaabaaabaabaabaababaabbabaaaabbabaabba

这还不是明文,提示你还需要一种解码;这种密码是培根密码:替换密码——根据所给表对应转换即可加密解密。

如下是解题的Python代码:

#Morse code + Bacon cipher

from wp2 import Morse

class Bacon():
    def __init__(self):
        self.dic={'a':'aaaaa','b':'aaaab','c':'aaaba','d':'aaabb',
                'e':'aabaa','f':'aabab','g':'aabba','h':'aabbb',
                'i':'abaaa','j':'abaab','k':'ababa','l':'ababb',
                'm':'abbaa','n':'abbab','o':'abbba','p':'abbbb',
                'q':'baaaa','r':'baaab','s':'baaba','t':'baabb',
                'u':'babaa','v':'babab','w':'babba','x':'babbb',
                'y':'bbaaa','z':'bbaab'
                }

    def enc(self,msg):
        cip=''
        dic=self.dic
        for c in msg:
            cip+=dic[c]
        return cip

    def dec(self,cip):
        msg=''
        dic=self.dic
        key=list(dic.keys())
        val=list(dic.values())
        for c in [cip[5*ii:5*(ii+1)] for ii in range(len(cip)/5)]:
            msg+=key[val.index(c)]
        return msg

def solve():
    cip='11 01 1011 001101 1000 0 001101 0000 01 0001 0 001101 01 10 111 1 0000 0 010 001101 100 0 1010 111 100 0 0000 0000 0000 0000 01 01 01 01 01 1000 01 01 1000 1000 1000 01 01 1000 1000 01 01 01 01 01 01 01 01 1000 01 01 1000 01 1000 01 01 01 01 01 01 01 1000 1000 01 1000 01 01 01 1000 1000 01 01 01 1000 1000 01 01 1000 01 01 01 01 1000 01 1000 01 01 1000 01 01 01 1000 1000 01 1000 01 01 01 1000 01 01 01 1000 01 01 1000 01 1000 1000 01 01 1000 1000 1000 01 1000 01 01 01 1000 01 1000 01 1000 1000 01 01 01 1000 1000 01 1000 01 01 01 1000 01 01 1000 01 01 1000 01 01 01 01 1000 1000 01 1000 1000 01 01 1000 1000 01 01 1000 01 01 1000 01 01 01 1000 01 01 1000 01 01 1000 01 01 1000 01 1000 01 01 1000 1000 01 1000 01 01 01 01 1000 1000 01 1000 01 01 1000 1000 01'
    morse=Morse()
    cip=morse.dec(cip)
    print cip
    cip=cip[cip.find('hhhh')+4:]
    bacon=Bacon()
    print bacon.dec(cip)

if __name__=='__main__':
    solve()

运行上述程序:

$ python wp3.py
attackanddefenceworldisinteresting

4. 幂数加密

这题实际是云影密码:26个英文字母在字母表中的次序ord(x)<(2^{5}),因此5位二进制数可以表示一个英文字母,即1,2,4,8,16的组合(求和)可表示一个英文字母,例如L在字母表中的次序为12=4+8,因此组合48就可以表示字母L;同时0作为分隔符。

如下是解题的Python代码:

s='8842101220480224404014224202480122'
ls=s.split('0')
dic='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
m=''
for c in ls:
    t=0
    for cc in c:
        t+=int(cc)
    m+=dic[t-1]
print m

运行上述程序:

$ python wp4.py
WELLDONE

5. Railfence

栅栏密码:将明文row个为一组,排列为col行(明文的长度可能小于为row(cdot)col,即最后一行可能不会填满),再将第一列的字母从上至下连接起来,接下来是第二列,直到第row列,生成密文。

但是此题是栅栏密码的一个变种——W型栅栏密码;例如,如下是一个密钥为5的W型栅栏密码,明文为1-19的自然数,将其按照W的形状排列,再由上至下,从左至右连接数字,生成密文[1,9,17,2,8,10,16,18,3,7,11,15,19,4,6,12,14,5,13]。

1             9               17
  2         8   10          16  18
    3      7      11      15      19
      4   6         12  14
        5             13

如下是解题的Python代码(此题的密钥为5):

#W kind Railfence cipher

class Railfence_W():
    def __init__(self,key=2):
        self.key=key

    def enc(self,msg,mode):
        #mode = 0 means decrypt,mode = 1 means encrypt
        ls=len(msg)
        key=self.key
        rep=range(0,ls,2*(key-1))
        for dd in range(1,key-1):
            ind=dd
            de1=2*(key-1-dd)
            de2=2*dd
            while ind<ls:
                rep.append(ind)
                ind+=de1
                if ind>=ls:
                    break
                rep.append(ind)
                ind+=de2
        rep.extend(range(key-1,ls,2*(key-1)))
        if mode:
            cips=''.join([msg[ii] for ii in rep])
        else:
            cip=rep[:]
            for ii in range(ls):
                cip[rep[ii]]=msg[ii]
            cips=''.join(cip)
        return cips

def solve():
    cip='ccehgyaefnpeoobe{lcirg}epriec_ora_g'
    for step in range(2,8):
        railfence_w=Railfence_W(step)
        print railfence_w.enc(cip,0)

if __name__=='__main__':
    solve()

运行上述程序:

$ python wp5.py
cccierhgg}yeaperfinepce_ooorbae_{gl
cnipceeoeocbhe_{glocyirraga}ee_pfrg
cal_cecfiornepgr}ehoeapogbr_iey{egc
cyberpeace{railfence_cipher_gogogo}
cgecraiioycaore_cgbeefe}_goe{nhplpr
chfbriaegengcyp{}c__eleaeeocpogrrio

6. easychallenge

附件是一个pyc文件,使用uncompyle6进行反编译得到py脚本,脚本中定义了3个编码函数,这3个编码函数都是可逆的,从而可求解出与给定编码数据对应的明文。

如下是解题的Python代码:

from base64 import b32decode

def decode1(ans):
    s = ''
    for i in ans:
        x=ord(i)-25
        x^=36
        s+=chr(x)
    return s

def decode2(ans):
    s = ''
    for i in ans:
        x=ord(i)^36
        x-=36
        s+=chr(x)
    return s

def decode3(ans):
    return b32decode(ans)

def solve():
    final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
    return decode1(decode2(decode3(final)))

if __name__=='__main__':
    print solve()

运行上述程序:

$ python wp6.py
cyberpeace{interestinghhhhh}

7. 转轮机加密

题目提示托马斯·杰斐逊,搜索一下有一个关于此人的密码——杰斐逊密码:首先,转轮机每一圈有若干字母,共有若干圈;加密时,将转轮机调整至某一列为明文,然后任选其他的某一列,作为密文。因此解密时,转轮机调整至某一列为密文,然后分析其他列,找到语句通顺的就是明文。

如下是解题的Python代码:

#Jefferson cipher

class Jefferson():
    def __init__(self,key):
        self.box=[
                'ZWAXJGDLUBVIQHKYPNTCRMOSFE',
                'KPBELNACZDTRXMJQOYHGVSFUWI',
                'BDMAIZVRNSJUWFHTEQGYXPLOCK',
                'RPLNDVHGFCUKTEBSXQYIZMJWAO',
                'IHFRLABEUOTSGJVDKCPMNZQWXY',
                'AMKGHIWPNYCJBFZDRUSLOQXVET',
                'GWTHSPYBXIZULVKMRAFDCEONJQ',
                'NOZUTWDCVRJLXKISEFAPMYGHBQ',
                'XPLTDSRFHENYVUBMCQWAOIKZGJ',
                'UDNAJFBOWTGVRSCZQKELMXYIHP',
                'MNBVCXZQWERTPOIUYALSKDJFHG',
                'LVNCMXZPQOWEIURYTASBKJDFHG',
                'JZQAWSXCDERFVBGTYHNUMKILOP'
                ]
        self.key=key

    def dec(self,cip):
        box=self.box
        key=self.key
        lb=len(box)
        tbox=[box[x-1] for x in key]
        assert lb==len(cip)
        for ii in range(lb):
            ind=tbox[ii].find(cip[ii])
            tbox[ii]=tbox[ii][ind:]+tbox[ii][:ind]
        for ii in range(len(box[0])):
            print (''.join([x[ii] for x in tbox])).lower()

def solve():
    cip='NFQKSEVOQOFNP'
    key=[2,3,7,5,13,12,9,1,8,10,4,11,6]
    jefferson=Jefferson(key)
    jefferson.dec(cip)

if __name__=='__main__':
    solve()

运行上述程序:

$ python wp7.py
...
sambkvlqsiaav
fireinthehole
uzaulcdkfprst
...

唯一一句人话就是fireinthehole,这就是flag。

原文地址:https://www.cnblogs.com/coming1890/p/13492954.html