实验吧-密码学-杯酒人生(特殊凯撒--维吉尼亚密码)(凯撒加解密脚本、维吉尼亚密码加解密脚本)...
題目:
使用古典密碼
一喵星人要想喵星發(fā)送一段不知道干什么用的密碼“BLOCKCIPHERDESIGNPRINCIPLE”,
但是它忘記了密鑰是什么, 手頭(爪頭)只有它自己加密過(guò)的密鑰“HTRUZYJW”, 而且它
還知道原密鑰是一個(gè)單詞, 你可以幫助它傳遞信息, 早日攻克藍(lán)星, 征服人類(lèi)嗎?
?
已經(jīng)提示要用古典密碼,現(xiàn)在有兩個(gè)字符串,一個(gè)是密碼,一個(gè)是密鑰。
密鑰沒(méi)加密前是一個(gè)單詞,我們用凱撒解碼,可以看到應(yīng)該是COMPUTER
而這個(gè)密碼在喵星人發(fā)送之前要進(jìn)行加密,一串大寫(xiě)字母,而且這一串字母是:block cipher design principle
意思就是:分組密碼設(shè)計(jì)原理
?
其實(shí),這是一個(gè)特殊的凱撒:維吉尼亞密碼
先介紹一下這個(gè)密碼,該密碼的加解密的對(duì)應(yīng)表是由26個(gè)字母的所有凱撒解碼組成。
A -A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B -B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C -C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D -D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E -E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F -F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G -G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H -H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I -I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J -J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K -K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L -L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M -M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N -N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O -O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P -P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q -Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R -R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S -S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T -T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U -U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V -V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W -W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X -X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y -Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z -Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
?
對(duì)于這個(gè)題來(lái)說(shuō),明文BLOCKCIPHERDESIGNPRINCIPLE,密鑰COMPUTER,加密方法就是:
明文第一個(gè)是B,密鑰第一個(gè)是C,于是就找在C開(kāi)頭的行中和B(第一行的字母)同一列的字母D。
循環(huán)使用COMPUTER將明文的對(duì)應(yīng)字母全部找出。
下面給出py腳本:
代碼轉(zhuǎn)自:https://blog.csdn.net/dongyanwen6036/article/details/76716373# encoding: utf-8def VigenereEncryto(min,key):MinLen=len(min)#明文長(zhǎng)度KeyLen=len(key)#密鑰長(zhǎng)度(q,r)=divmod(MinLen,KeyLen)#q商 r余數(shù)out=""#完整映射密鑰的加密for i in range(0,q):for j in range(0,KeyLen):#談?wù)労诵拇a理解結(jié)合實(shí)例#密鑰:R#明文:T#密文:K:#(R-A)%26+A和(T-A)%26+A得到K===>(T-A+R-A)%26+A#(T-A)%26+A就是以A開(kāi)頭第T個(gè)元素,A與R列對(duì)齊意思即是,(R-A)%26+A就是以R頭字母表,R之后的第T-A元素c=int((ord(min[i*KeyLen+j])-ord('A')+ord(key[j])-ord('A'))%26+ord('A'))out+=chr(c)#殘余映射密鑰加密for i in range(0,r):c=int((ord(min[q*KeyLen+i])-ord('A')+ord(key[i])-ord('A'))%26+ord('A'))out+=chr(c)return outdef VigenereDecryto(anwen,key):AnLen=len(anwen)#明文長(zhǎng)度KeyLen=len(key)#密鑰長(zhǎng)度(q,r)=divmod(AnLen,KeyLen)#q商 r余數(shù)out=""#完整映射密鑰的加密for i in range(0,q):for j in range(0,KeyLen):#已知暗文位置減去A,加上Z減去key的位置就是,A到明文長(zhǎng)度#K-A+1 + Z-R===〉T-Ac=int((ord(anwen[i*KeyLen+j])-ord('A')+1+ord('Z')-ord(key[j]))%26+ord('A'))out+=chr(c)#殘余映射密鑰加密for i in range(0,r):c=int((ord(anwen[q*KeyLen+i])-ord('A')+1+ord('Z')-ord(key[i]))%26+ord('A'))out+=chr(c)return out def Lower(str):u=""for i in str:u+=i.lower()return uif __name__=='__main__':num=input('選擇維吉尼亞模式:1加密,2解密: ')if num=='1':str=input('請(qǐng)輸入明文: ')key=input('請(qǐng)輸入密鑰: ')print('加密后的密文: '+VigenereEncryto(str,key))print('密文轉(zhuǎn)化成小寫(xiě): '+Lower(VigenereEncryto(str,key)))elif num=='2':str=input('請(qǐng)輸入密文: ')key=input('請(qǐng)輸入密鑰: ')print('解密后的明文: '+VigenereDecryto(str,key))print('明文轉(zhuǎn)化成小寫(xiě): '+Lower(VigenereDecryto(str,key)))else:print('Error')跑一下出來(lái)結(jié)果:DZAREVMGJSDSYLMXPDDXHVMGNS
?
順帶附上凱撒解碼腳本:
#代碼轉(zhuǎn)自:https://blog.csdn.net/dongyanwen6036/article/details/76716373#實(shí)現(xiàn)大小寫(xiě)字母并行平移 def change1(c,i):num=ord(c)if(num>=97 and num<=122): num=97+(num+i-97)%(26) return chr(num) def change2(c,i):num=ord(c)if(num>=65 and num<=90): num=65+(num+i-65)%(26) return chr(num) def kaisa_jiAmi(string,i): string_new='' for s in string:num=ord(s)if(num>=97 and num<=122 ):string_new+=change1(s,i)elif(num>=65 and num<=90 ):string_new+=change2(s,i)print(string_new) return string_new #本題有種暴力解密感覺(jué) def kaisa_jiEmi(string): for i in range(0,26): print('第'+str(i+1)+'種可能:',end='')#區(qū)別在于 string 是該對(duì)象原本就是字符串類(lèi)型, 而 str()則是將該對(duì)象轉(zhuǎn)換成字符串類(lèi)型。 kaisa_jiAmi(string,i) #你要知道input輸入的數(shù)據(jù)類(lèi)型都是string def main(): print('請(qǐng)輸入操作,注意默認(rèn)小寫(xiě),大寫(xiě)同理:') choice=input('1:愷撒加密,2:凱撒窮舉解密.請(qǐng)輸入1或2:') if choice=='1': string=input('請(qǐng)輸入需要加密字符串: ') num=int(input('請(qǐng)輸入需要加密的KEY: ')) kaisa_jiAmi(string,num) elif choice=='2': string=input('請(qǐng)輸入需要解密字符串: ') kaisa_jiEmi(string) else: print('輸入錯(cuò)誤,請(qǐng)重試') main() if __name__=='__main__': main()?
轉(zhuǎn)載于:https://www.cnblogs.com/RenoStudio/p/10355094.html
總結(jié)
以上是生活随笔為你收集整理的实验吧-密码学-杯酒人生(特殊凯撒--维吉尼亚密码)(凯撒加解密脚本、维吉尼亚密码加解密脚本)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: codeforces 1039B Sub
- 下一篇: 关于ppt中嵌入echarts图表