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”,而且它
还知道原密钥是一个单词。到此,题目中已经提示是一个单词。这次修改了以前代码,实现大小写并行平移,
不过我还是感觉改成小写好在可以更熟悉他是个什么单词,比起看大写更容易辨认。最后推荐一起使用
用代码跑一下得到:
第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这就得到密钥
本题明文是:BLOCKCIPHERDESIGNPRINCIPLE
密钥已经求得:COMPUTER
要求发送一段密文:flag:DZAREVMGJSDSYLMXPDDXHVMGNS
杯酒人生:
使用古典密码
一喵星人要想喵星发送一段不知道干什么用的密码“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)%26+A和(T-A)%26+A得到K===>(T-A+R-A)%26+A
#(T-A)%26+A就是以A开头第T个元素,A与R列对齐意思即是,(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 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]))%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 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