杯酒人生详解----实验吧

xiaoxiao2021-02-28  78

http://www.shiyanbar.com/ctf/1826 杯酒人生: 使用古典密码 一喵星人要想喵星发送一段不知道干什么用的密码“BLOCKCIPHERDESIGNPRINCIPLE”, 但是它忘记了密钥是什么, 手头(爪头)只有它自己加密过的密钥“HTRUZYJW”, 而且它 还知道原密钥是一个单词, 你可以帮助它传递信息, 早日攻克蓝星, 征服人类吗? 解: 背景介绍: 维吉尼亚密码: 将26个恺撒密表合成一个,见下表这个表真美:    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 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 例如明文:TO BE OR NOT TO BE THAT IS THE QUESTION 当选定RELATIONS作为密钥时,加密过程是:明文一个字母为T,第一个密钥字母为R,因此可以找到在R行中代替T的为K,依此类推,得出对应关系如下: 密钥:RELAT IONSR ELATI ONSRE LATIO NSREL 明文:TOBEO RNOTT OBETH ATIST HEQUE STION 密文:KSMEH ZBBLK SMEMP OGAJX SEJCS FLZSY 本题都是凯撒密码解: 1.首先采用通常的凯撒密码解,原话:加密过的密钥“HTRUZYJW”,而且它 还知道原密钥是一个单词。到此,题目中已经提示是一个单词。这次修改了以前代码,实现大小写并行平移, 不过我还是感觉改成小写好在可以更熟悉他是个什么单词,比起看大写更容易辨认。最后推荐一起使用 #实现大小写字母并行平移 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 #本题有种暴力解密感觉 def kaisa_jiEmi(string): for i in range(0,26): print('第'+str(i+1)+'种可能:',end=' ') #区别在于 string 是该对象原本就是字符串类型, 而 str()则是将该对象转换成字符串类型。 kaisa_jiAmi(string,i) #你要知道input输入的数据类型都是string def main(): print('请输入操作,注意默认小写,大写同理:') choice=input('1:恺撒加密,2:凯撒穷举解密.请输入1或2:') if choice=='1': string=input('请输入需要加密字符串: ') num=int(input('请输入需要加密的KEY: ')) kaisa_jiAmi(string,num) elif choice=='2': string=input('请输入需要解密字符串: ') kaisa_jiEmi(string) else: print('输入错误,请重试') main() if __name__=='__main__': main() 用代码跑一下得到: 第1种可能:   htruzyjw 第2种可能:   iusvazkx 第3种可能:   jvtwbaly 第4种可能:   kwuxcbmz 第5种可能:   lxvydcna 第6种可能:   mywzedob 第7种可能:   nzxafepc 第8种可能:   oaybgfqd 第9种可能:   pbzchgre 第10种可能:   qcadihsf 第11种可能:   rdbejitg 第12种可能:   secfkjuh 第13种可能:   tfdglkvi 第14种可能:   ugehmlwj 第15种可能:   vhfinmxk 第16种可能:   wigjonyl 第17种可能:   xjhkpozm 第18种可能:   ykilqpan 第19种可能:   zljmrqbo 第20种可能:   amknsrcp 第21种可能:   bnlotsdq 第22种可能:   computer 第23种可能:   dpnqvufs 第24种可能:   eqorwvgt 第25种可能:   frpsxwhu 第26种可能:   gsqtyxiv 得到computer最后因为输入的都是大写(说明程序默认处理都是小写字母,如果大写字母那么道理同小写一样,毕竟字母表顺序一样 ,所以平移量一样的化就是在把对应的小写字母转化为大写) 所以手动转为大写COMPUTER这就得到密钥

2.题目中出现全大写,想到古典密码特殊凯撒密码---维吉尼亚密码

#——*coding:utf-8*- def VigenereEncryto(min,key): MinLen=len(min)#明文长度 KeyLen=len(key)#密钥长度 (q,r)=divmod(MinLen,KeyLen)#q商 r余数 out="" #完整映射密钥的加密 for i in range(0,q): for j in range(0,KeyLen): #谈谈核心代码理解结合实例 #密钥:R #明文:T #密文:K: #(R-A)&+A和(T-A)&+A得到K===>(T-A+R-A)&+A #(T-A)&+A就是以A开头第T个元素,A与R列对齐意思即是,(R-A)&+A就是以R头字母表,R之后的第T-A元素 c=int((ord(min[i*KeyLen+j])-ord('A')+ord(key[j])-ord('A'))&+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'))&+ord('A')) out+=chr(c) return out def VigenereDecryto(anwen,key): AnLen=len(anwen)#明文长度 KeyLen=len(key)#密钥长度 (q,r)=divmod(AnLen,KeyLen)#q商 r余数 out="" #完整映射密钥的加密 for i in range(0,q): for j in range(0,KeyLen): #已知暗文位置减去A,加上Z减去key的位置就是,A到明文长度 #K-A+1 + Z-R===〉T-A c=int((ord(anwen[i*KeyLen+j])-ord('A')+1+ord('Z')-ord(key[j]))&+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]))&+ord('A')) out+=chr(c) return out def Lower(str): u="" for i in str: u+=i.lower() return u if __name__=='__main__': num=input('选择维吉尼亚模式:1加密,2解密: ') if(num=='1'): str=input('请输入明文: ') key=input('请输入密钥: ') print('加密后的密文: '+VigenereEncryto(str,key)) print('密文转化成小写: '+Lower(VigenereEncryto(str,key))) elif(num=='2'): str=input('请输入密文: ') key=input('请输入密钥: ') print('解密后的明文: '+VigenereDecryto(str,key)) print('明文转化成小写: '+Lower(VigenereDecryto(str,key))) else: print('Error')

本题明文是:BLOCKCIPHERDESIGNPRINCIPLE 密钥已经求得:COMPUTER 要求发送一段密文:flag:DZAREVMGJSDSYLMXPDDXHVMGNS
转载请注明原文地址: https://www.6miu.com/read-22946.html

最新回复(0)