Crypto Challenge Set 1解题报告
1、Convert hex to base64
题意:给出一个hex编码过的字符串,将它进行base64加密
解题关键:直接利用base64库函数实现
import base64
str1="49276d206b696c6c696e6720796f757220627261696e206c696b65206120706f69736f6e6f7573206d757368726f6f6d".decode("hex")
me = base64.b64encode(str1)
print me
2、Fixed XOR
题意:将两个16进制字符串进行异或
解题关键:将16进制字符串解码,对每个字符分别进行异或,最后编码成16进制即可。
#coding=utf-8
import base64
import re
#异或操作无论对什么数都是以二进制的形式实现,所以无所谓进制
#str1=long("1c0111001f010100061a024b53535009181c",16)
#str2=long("686974207468652062756c6c277320657965",16)
str1="1c0111001f010100061a024b53535009181c".decode('hex')
str2="686974207468652062756c6c277320657965".decode('hex')
str3=[]
for i in range(0,len(str1)):
str3+=[chr(ord(str1[i])^ord(str2[i]))]
str3="".join(str3)
print str3.encode('hex') #str=str1^str2
#print hex(str)
#print str
3、Single-byte XOR cipher
题意:字符串被某个单字符加密过,找出这个字符
解题关键:1、字符所处的ASCII码范围为0-255,暴力搜索,得出字符串字母数量最多的即为解。
2、判断的方式还可以按照英文中各字母出现的频率计算。
法一:
#coding=utf-8
import re
str="1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736"
score=0
for i in range(0,129):
tmp=[]
for j in re.findall(".{2}",str):#任意两个字符的字符串
tmp += chr(i^int(j,16))
tmpstr = "".join(tmp)
num=0
for j in range(0,len(tmpstr)):
if tmpstr[j]>='a'and tmpstr[j]<='z':#or tmpstr[j]>='A'and tmpstr[j]<='Z':
num+=1
if num>score:
#print tmpstr
score=num#用于更新用
ansstr=tmpstr
key=chr(i)
print key
print ansstr
法二:
#coding=utf-8
import re
def english_test(sentence):
score = 0
freqs = {
'a': 0.0651738, 'b': 0.0124248, 'c': 0.0217339,
'd': 0.0349835, 'e': 0.1041442, 'f': 0.0197881,
'g': 0.0158610, 'h': 0.0492888, 'i': 0.0558094,
'j': 0.0009033, 'k': 0.0050529, 'l': 0.0331490,
'm': 0.0202124, 'n': 0.0564513, 'o': 0.0596302,
'p': 0.0137645, 'q': 0.0008606, 'r': 0.0497563,
's': 0.0515760, 't': 0.0729357, 'u': 0.0225134,
'v': 0.0082903, 'w': 0.0171272, 'x': 0.0013692,
'y': 0.0145984, 'z': 0.0007836, ' ': 0.1918182}
for x in sentence.lower():
if x in freqs:
score += freqs[x]
return score str="1b37373331363f78151b7f2b783431333d78397828372d363c78373e783a393b3736"
score=0
for i in range(0,129):
tmp=[]
for j in re.findall(".{2}",str):#任意两个字符的字符串
tmp += chr(i^int(j,16))
tmpstr = "".join(tmp)
num=english_test(tmpstr)
if num>score:
#print tmpstr
score=num#用于更新用
ansstr=tmpstr
key=chr(i)
print key
print ansstr
4、 Detect single-character XOR
题意: 文本中有一个字符串被单字符加密过,找出这个字符串
解题关键:对file中所有的字符串进行暴力匹配字符,最终得到小写字母数量最多的字符串和秘钥字符即为解(以下进行异或匹配的时候,判断方式均可运用频率函数)
#coding=utf-8
import re
#with open("ex4.txt") as fp:
#wenben=[i for i in open("ex4.txt").readlines()]
wenben=[]
for i in open("ex4.txt","r").readlines():
wenben+=[i.replace("\n","")] #序列相加
score=0
for k in wenben:
for i in range(0,129):
tmp=[]
for j in re.findall(".{2}",k):#任意两个字符的字符串
tmp += chr(i^int(j,16))
tmpstr = "".join(tmp)
num=0
num=len(re.findall(r'[a-zA-Z ]',tmpstr))#一定注意不要落下空格
if num>score:
score=num#用于更新用
ansstr=tmpstr
c=k
key=chr(i)
print c
print key
print ansstr
5、Implement repeating-key XOR
题意:将某个字符串使用秘钥进行重复异或
解题关键: 将秘钥扩展,单字节异或即可,最后编码成16进制
import re
str1=re.findall('.{2}',"Burning 'em, if you ain't quick and nimble I go crazy when I hear a cymbal".encode('hex'))
str2=re.findall('.{2}',("ICE"*200).encode('hex'))
str3=[]
for i in range(0,len(str1)):
str3 +=[(chr(int(str1[i],16)^int(str2[i],16)))]
print "".join(str3).encode('hex')
import re
str1="Burning 'em, if you ain't quick and nimble I go crazy when I hear a cymbal"
str2="ICE"*200
str3=[]
for i in range(0,len(str1)):
str3 +=[(chr(ord(str1[i])^ord(str2[i])))]
print "".join(str3).encode('hex')
#for i in range(0,len(str1)):
# str3 +=[(hex(ord(str1[i])^ord(str2[i])))]
#print "".join(str3)
6、Break repeating-key XOR
题意:base64编码后的字符串使用某串key加密过,解出明文
解题关键:首先按照可能的keysize对密文进行分块,取前4个进行两两求汉明距离,若分块的长度等于keysize,则应具有最小的汉明距离,(字母之间的汉明距离小),得到keysize之后,对分块的第一位、第二位分别进行匹配,最终得到解。
法一:转化为hex求解
#coding:utf-8
import re
import base64
with open("ex6.txt","r") as fp:
wenben=[base64.b64decode(i) for i in fp.readlines()]
wenben="".join(wenben) def english_test(sentence):
score = 0
freqs = {
'a': 0.0651738, 'b': 0.0124248, 'c': 0.0217339,
'd': 0.0349835, 'e': 0.1041442, 'f': 0.0197881,
'g': 0.0158610, 'h': 0.0492888, 'i': 0.0558094,
'j': 0.0009033, 'k': 0.0050529, 'l': 0.0331490,
'm': 0.0202124, 'n': 0.0564513, 'o': 0.0596302,
'p': 0.0137645, 'q': 0.0008606, 'r': 0.0497563,
's': 0.0515760, 't': 0.0729357, 'u': 0.0225134,
'v': 0.0082903, 'w': 0.0171272, 'x': 0.0013692,
'y': 0.0145984, 'z': 0.0007836, ' ': 0.1918182}
for x in sentence.lower():
if x in freqs:
score += freqs[x]
return score def hanming(x,y):
num=0
for i in range(0,len(x)):
t=ord(x[i])^ord(y[i])
while t:
if t&1 : num+=1
t>>=1
return num def thechar(st1):
score = 0
for i in range(0, 255):
tmp = []
for j in range(0,len(st1)): # 任意两个字符的字符串
tmp += chr(i ^ int(st1[j],16))
tmpstr = "".join(tmp) #num=len(re.findall(r'[a-zA-Z ,\.;?!:]',tmpstr)) #'[a-zA-Z ,\.?!:;]'
num=english_test(tmpstr)
if num > score:
score = num # 用于更新用
key = chr(i)
#print key,score
return key ans = []
for i in range(1,41):
str1=[]
str2=[]
str3=[]
str4=[]
for j in range(0,i): str1+=[wenben[j]]
for j in range(i,2*i): str2+=[wenben[j]]
for j in range(2*i,3*i): str3+=[wenben[j]]
for j in range(3*i,4*i): str4+=[wenben[j]]
str1="".join(str1)
str2="".join(str2)
str3="".join(str3)
str4="".join(str4)
x1=float(hanming(str1,str2))/i
x2=float(hanming(str2,str3))/i
x3=float(hanming(str3,str4))/i
x4=float(hanming(str1,str4))/i
x5=float(hanming(str1,str3))/i
x6=float(hanming(str2,str4))/i
aa=(x1+x2+x3+x4+x5+x6)/6
ans+=[(i,aa)]
ans.sort(lambda x,y:cmp(x[1],y[1]))
for i in range(len(ans)):
print ans[i][0],ans[i][1]
#print len(wenben)
#print len(wenben)%29
wenben=wenben.encode('hex') block=[re.findall(r'(.{2})',z) for z in re.findall(r'(.{58})',wenben)] keyy = []
for i in range(0,29):
tmp=[]
for j in range(0,len(block)):
tmp+=[block[j][i]]
keyy+=[thechar(tmp)]
keyy="".join(keyy) print keyy
keyy=keyy*10000 wenben=wenben.decode('hex')
an=[]
for i in range(0,len(wenben)):
an+=[chr(ord(wenben[i])^ord(keyy[i]))]
an="".join(an)
print an
法二:直接对字符串进行求解:debug了两天,原来是正则表达式的.无法匹配换行符的原因,换了个写法就过了
#coding:utf-8
import re
import base64
with open("ex6.txt","r") as fp:
wenben=[base64.b64decode(i) for i in fp.readlines()]
print len(wenben[2])
wenben="".join(wenben) def english_test(sentence):
score = 0
freqs = {
'a': 0.0651738, 'b': 0.0124248, 'c': 0.0217339,
'd': 0.0349835, 'e': 0.1041442, 'f': 0.0197881,
'g': 0.0158610, 'h': 0.0492888, 'i': 0.0558094,
'j': 0.0009033, 'k': 0.0050529, 'l': 0.0331490,
'm': 0.0202124, 'n': 0.0564513, 'o': 0.0596302,
'p': 0.0137645, 'q': 0.0008606, 'r': 0.0497563,
's': 0.0515760, 't': 0.0729357, 'u': 0.0225134,
'v': 0.0082903, 'w': 0.0171272, 'x': 0.0013692,
'y': 0.0145984, 'z': 0.0007836, ' ': 0.1918182}
for x in sentence.lower():
if x in freqs:
score += freqs[x]
return score def hanming(x,y):
num=0
for i in range(0,len(x)):
t=ord(x[i])^ord(y[i])
while t:
if t&1 : num+=1
t>>=1
return num def thechar(st1):
score = 0
for i in range(0, 255):
tmp = []
for j in range(0,len(st1)): # 任意两个字符的字符串
#print str1
tmp += chr(i ^ ord(st1[j]))
tmpstr = "".join(tmp)
#num=len(re.findall(r'[a-zA-Z ,\.;?!:]',tmpstr)) #'[a-zA-Z ,\.?!:;]'
num=english_test(tmpstr)
if num > score:
score = num # 用于更新用
key = chr(i)
#print key,score
return key ans = []
for i in range(1,41):
str1=[]
str2=[]
str3=[]
str4=[]
for j in range(0,i): str1+=[wenben[j]]
for j in range(i,2*i): str2+=[wenben[j]]
for j in range(2*i,3*i): str3+=[wenben[j]]
for j in range(3*i,4*i): str4+=[wenben[j]]
str1="".join(str1)
str2="".join(str2)
str3="".join(str3)
str4="".join(str4)
x1=float(hanming(str1,str2))/i
x2=float(hanming(str2,str3))/i
x3=float(hanming(str3,str4))/i
x4=float(hanming(str1,str4))/i
x5=float(hanming(str1,str3))/i
x6=float(hanming(str2,str4))/i
aa=(x1+x2+x3+x4+x5+x6)/6
ans+=[(i,aa)]
ans.sort(lambda x,y:cmp(x[1],y[1]))
for i in range(len(ans)):
print ans[i][0],ans[i][1]
#print len(wenben)
#print len(wenben)%29
#wenben=wenben.encode('hex')
#print wenben
#wenben=wenben.decode('utf-8')
block=re.findall(r'[\s\S]{29}',wenben)
#block=[wenben[i:i+29] for i in xrange(0,len(wenben),29)]
#for i in range(0,len(block)):
# block[i]=block[i]
b1=[]
print block
#print block[0][4].encode('hex')
print block[0]
print len(block[0])
nn=0
for i in range(0,len(block)):
for j in range(0,len(block[i])):
nn+=1
print nn print [z.encode('hex') for z in block[3]]
print block[3][28].encode('hex')
print len(block[3])
print block[3][0].encode('hex')
print block[3]
#['37', '16', '06', '0c', '1a', '17', '41', '1d', '01', '52', '54', '30', '5f', '00', '20', '13', '0a', '05', '47', '4f', '12', '48', '08', '45', '4e', '65', '3e', '16', '09'] keyy = []
for i in range(0,29):
tmp=[]
for j in range(0,len(block)):
tmp+=block[j][i]
tmp="".join(tmp)
keyy+=thechar(tmp)
keyy="".join(keyy) print keyy
keyy=keyy*10000 #wenben=wenben.decode('hex')
an=[]
for i in range(0,len(wenben)):
an+=[chr(ord(wenben[i])^ord(keyy[i]))]
an="".join(an)
print an
7、AES in ECB mode
题意:解密进行aes-128加密过的字符串
解题关键:利用pycrypto库,首先将秘钥编码,然后进行AES编码即可。
from Crypto.Cipher import AES
import base64,re
with open("ex7.txt","r") as fp:
C=[base64.b64decode(i.replace("\n","")) for i in fp.readlines()]
C="".join(C) key = "YELLOW SUBMARINE"
cipher=AES.new(key,AES.MODE_ECB)
m= cipher.decrypt(C)
print m
8、Detect AES in ECB mode
题意:找出被ECB加密过的字符串
解题关键:将文本连接起来,以16字节分块,根据ECB的性质,相同的 16 字节明文经过加密后总会产生相同的 16 字节密文,若存在相同块,即可ECS编码
import re
with open("ex8.txt","r") as fp:
wenben=[i.replace("\n","") for i in fp.readlines()]
for ecb in wenben:
block =re.findall(".{16}",ecb)
if len(block)-len(set(block)):
print ecb
Crypto Challenge Set 1解题报告的更多相关文章
- 【CodeChef】December Challenge 2019 Div1 解题报告
点此进入比赛 这次比赛本来想好好打的,但不幸的是,这周先是要认真复习准备月考,考完又是发烧在床上躺了一个周末,所以最终没能打完. 我还是好弱啊. \(T1\):Binary XOR(点此看题面) 大致 ...
- 【CodeChef】August Challenge 2019 Div2 解题报告
点此进入比赛 \(T1\):Football(点此看题面) 大致题意: 求\(max(20a_i-10b_i,0)\). 送分题不解释. #include<bits/stdc++.h> # ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- 二模13day1解题报告
二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...
- BZOJ 1051 最受欢迎的牛 解题报告
题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4438 Solved: 2353[S ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- 习题:codevs 1035 火车停留解题报告
本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...
- 习题: codevs 2492 上帝造题的七分钟2 解题报告
这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...
- 习题:codevs 1519 过路费 解题报告
今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...
随机推荐
- hdu4612 无向图中随意加入一条边后使桥的数量最少 / 无向图缩点+求树的直径
题意如上,含有重边(重边的话,俩个点就能够构成了边双连通). 先缩点成树,在求数的直径,最远的连起来,剩下边(桥)的自然最少.这里学习了树的直径求法:第一次选随意起点U,进行bfs,到达最远的一个点v ...
- EasyPusher进行Android UVC外接摄像头直播推送实现方法
最近EasyPusher针对UVC摄像头做了适配.我们结合了UVCCamera与EasyPusher,支持将UVC摄像头的视频推送到RTSP服务器上.在此特别感谢UVCCamera这个牛逼的项目! 来 ...
- Grunt是什么,以及它的一些使用方法
♥什么是Grunt Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器.grunt是基于node 更多插件请访问:http://www.gruntjs.n ...
- 关于spring的bean
1 spring bean的单例和多例 singleton 单例指的是,在需要该bean的地方,spring framework返回的是同一个值. prototype 多例指的是,在需要该bean的地 ...
- Xshell 连接centOS虚拟机、centOS内置python版本升级
Xshell 连接虚拟机 前置条件:VMware Workstation 12.5.1.Xshell 5 . centOS 6.6 1.打开虚拟机,输入用户名和密码: 2.输出命令:ifconfig ...
- Grunt学习笔记【3】---- filter使用方式和实现原理详解
本文主要讲配置任务中的filter,包括使用默认fs.Stats方法名和自定义过滤函数,以及filter的实现原理. 通过设置filter属性可以实现一些特殊处理逻辑.例如:要清理某个文件夹下的所有空 ...
- mysql一:操作数据库
创建数据库是指在数据库空间中划出一块空间用来存储相关的数据,表就是存储在对应的数据库里面.首先来看下查看数据库的命令:show databases. 这个是用来查询数据库空间下所有的数据库,其中inf ...
- 微软Azure区块链开发工具包三大功能详解
2018年11月15日,微软宣布了Azure区块链开发工具包,它基于微软的无服务器技术构建,并且利用微软和第三方SaaS,完美集成了区块链.该工具包扩展了微软的区块链开发模板和Azure Blockc ...
- 腾讯云上运行java程序过程
1: 购买服务器(腾讯云,阿里云等) 2:安装centos操作系统: 3:安装jdkhttp://www.cnblogs.com/Amos-Turing/p/7403696.html 4:安装数据库( ...
- 设计模式 - 单件模式(singleton pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/28595349 单件模式(singleton ...