python实现维吉尼亚解密,维吉尼亚密码怎么算,# -*-codin


# -*-coding:UTF-8-*-from sys import  stdoutmiwen = "KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVFDETDGILTXRGUD DKOTFMBPVGEGLTGCKQRACQCWDNAWCRXIZAKFTLEWRPTYCQKYVXCHKFTPONCQQRHJVAJUWETMCMSPKQDYHJVDAHCTRLSVSKCGCZQQDZXGSFRLSWCWSJTBHAFSIASPRJAHKJRJUMVGKMITZHFPDISPZLVLGWTFPLKKEBDPGCEBSHCTJRWXBAFSPEZQNRWXCVYCGAONWDDKACKAWBBIKFTIOVKCGGHJVLNHIFFSQESVYCLACNVRWBBIREPBBVFEXOSCDYGZWPFDTKFQIY CWHJVLNHIQIBTKHJVNPIST"Ix = 0.065ziranpinlv=[0.081,0.014,0.038,0.039,0.122,0.022,0.017,0.045,0.071,0.001,0.004,0.037,0.034,0.070,0.072,0.028,0.000,0.068,0.063,0.094, 0.025,0.010,0.015,0.002,0.015,0.000]print ziranpinlv.__len__()huifufenzu = []huifupianduan = ""def keylength(miwen): #计算秘钥长度    miwen = miwen.replace(" ", "") #替换掉密文中的空格    chushimiwenlen = miwen.__len__()    fenzumiwenlen = chushimiwenlen    left = 0    right = 0    max_pinlv = 0    key_len = 0    for i in range(2,8):#安装key不同长度进行分组        while 0!=(fenzumiwenlen%i):            fenzumiwenlen=fenzumiwenlen-1        jianju =  i        right = i        fenzu=[]        while(right<=fenzumiwenlen):            fenzu.append(miwen[left:right])            left = right            right = right+jianju        left = 0        right = 0        jianju = 0        mm = ""        for m in range(1, chushimiwenlen - fenzumiwenlen + 1):            mm = miwen[-m] + mm        fenzu.append(mm)        fenzumiwenlen = chushimiwenlen        mm = ""        xinfenzu = []        for q in range(i):            xinfenzu.append("")        for w in range(i):            for y in range(fenzu.__len__()):                if  fenzu[y].__len__()>= w+1:                    xinfenzu[w] = xinfenzu[w]+ fenzu[y][w]        pinlv = []        for pp in range(xinfenzu.__len__()):            pinlv.append(0)        fenzupinlv = []        fenzupinlv = jisuanpinlv(xinfenzu,fenzupinlv)        for ppp  in range(xinfenzu.__len__()):            for pppp in range(ppp*26,(ppp+1)*26):                pinlv[ppp] = round(pinlv[ppp]+ fenzupinlv[pppp]*fenzupinlv[pppp],3)        pingjun = 0        for oo in range(pinlv.__len__()):            pingjun = pingjun + pinlv[oo]        pingjun = round(pingjun/pinlv.__len__(),5)        if pingjun > max_pinlv:            max_pinlv = pingjun            key_len = pinlv.__len__()    decrypt(miwen,chushimiwenlen,key_len)def jisuanpinlv(xinfenzu,fenzupinlv):#    for l in range(xinfenzu.__len__()):        for a in range(65, 91):            zimuchuxiancishu = 0            for zimu in xinfenzu[l]:                if chr(a) == zimu:                    zimuchuxiancishu = zimuchuxiancishu + 1            fenzupinlv.append(round(float(zimuchuxiancishu)/float(xinfenzu[l].__len__()),3))    return fenzupinlvdef decrypt(miwen,chushimiwenlen,key_len):        i = key_len #进行分组        xinfenzu = []        fenzumiwenlen = chushimiwenlen        while 0!=(fenzumiwenlen%i):            fenzumiwenlen -= 1        jianju =  i        right = i        fenzu=[]        left = 0        while(right<=fenzumiwenlen):            fenzu.append(miwen[left:right])            left = right            right = right+jianju        mm = ""        for m in range(1, chushimiwenlen - fenzumiwenlen + 1):            mm = miwen[-m] + mm        fenzu.append(mm)        fenzumiwenlen = chushimiwenlen        xinfenzu = []        for q in range(i):            xinfenzu.append("")        for w in range(i):            for y in range(fenzu.__len__()):                if  fenzu[y].__len__()>= w+1:                    xinfenzu[w] = xinfenzu[w]+ fenzu[y][w]        print xinfenzu        plaintext(xinfenzu)def plaintext(xinfenzu):    fenzupinlv = []    for l in range(xinfenzu.__len__()):        for a in range(65, 91):            zimuchuxiancishu = 0            for zimu in xinfenzu[l]:                if chr(a) == zimu:                    zimuchuxiancishu = zimuchuxiancishu + 1            fenzupinlv.append(round(float(zimuchuxiancishu)/float(xinfenzu[l].__len__()),3))        k = shift(fenzupinlv[l*26:(l+1)*26])        mingwenpianduan = shuchumingwen(xinfenzu[l],k)        global huifufenzu        huifufenzu.append(mingwenpianduan)    print huifufenzu    huifu()def shift(fenzupinlv):    Mg = 0    max_k = 0    fenzu_k = []    for i in range(26):        for j  in range(26):            Mg = Mg + round(fenzupinlv[(j+i)%26]*ziranpinlv[j],3)        fenzu_k.append(round(Mg,3))        Mg = 0    return fenzu_k.index(max(fenzu_k))def shuchumingwen(xinfenzu,k):    global huifupianduan    huifupianduan= ""    for hh in range(xinfenzu.__len__()):            if ord(xinfenzu[hh])-k>=65:                huifupianduan = huifupianduan + chr(ord(xinfenzu[hh])-k)            if ord(xinfenzu[hh])-k<65:                huifupianduan = huifupianduan + chr((ord(xinfenzu[hh])-65-k)%91)    return huifupianduandef huifu():    global huifufenzu    mingwen = ""    for i in range(huifufenzu.__len__()):        if i == 0:            mingwen = mingwen + huifufenzu[i][:56]        else:            mingwen = mingwen +huifufenzu[i]    for k in range(56):        for j in range(k,mingwen.__len__(),56):            stdout.write(mingwen[j])    stdout.write(huifufenzu[0][-1:])keylength(miwen)

python实现维吉尼亚解密

评论关闭