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解题报告的更多相关文章

  1. 【CodeChef】December Challenge 2019 Div1 解题报告

    点此进入比赛 这次比赛本来想好好打的,但不幸的是,这周先是要认真复习准备月考,考完又是发烧在床上躺了一个周末,所以最终没能打完. 我还是好弱啊. \(T1\):Binary XOR(点此看题面) 大致 ...

  2. 【CodeChef】August Challenge 2019 Div2 解题报告

    点此进入比赛 \(T1\):Football(点此看题面) 大致题意: 求\(max(20a_i-10b_i,0)\). 送分题不解释. #include<bits/stdc++.h> # ...

  3. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  4. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  5. BZOJ 1051 最受欢迎的牛 解题报告

    题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[S ...

  6. 习题:codevs 2822 爱在心中 解题报告

    这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...

  7. 习题:codevs 1035 火车停留解题报告

    本蒟蒻又来写解题报告了.这次的题目是codevs 1035 火车停留. 题目大意就是给m个火车的到达时间.停留时间和车载货物的价值,车站有n个车道,而火车停留一次车站就会从车载货物价值中获得1%的利润 ...

  8. 习题: codevs 2492 上帝造题的七分钟2 解题报告

    这道题是受到大犇MagHSK的启发我才得以想出来的,蒟蒻觉得自己的代码跟MagHSK大犇的代码完全比不上,所以这里蒟蒻就套用了MagHSK大犇的代码(大家可以关注下我的博客,友情链接就是大犇MagHS ...

  9. 习题:codevs 1519 过路费 解题报告

    今天拿了这道题目练练手,感觉自己代码能力又增强了不少: 我的思路跟别人可能不一样. 首先我们很容易就能看出,我们需要的边就是最小生成树算法kruskal算法求出来的边,其余的边都可以删掉,于是就有了这 ...

随机推荐

  1. kafka source type

    https://flume.apache.org/FlumeUserGuide.html # example.conf: A single-node Flume configuration # Nam ...

  2. varnish代理缓存服务器的安装与使用

    1. 下载解压 cd /usr/local/src/ wget https://codeload.github.com/varnishcache/varnish-cache/zip/master ch ...

  3. POJ3984 迷宫问题【水BFS】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011775691/article/details/28050277 #include <cs ...

  4. pm2 的使用

    pm2.json 代码如下 [{ "name" : "dingtalk-mobile", "script" : "app.js&q ...

  5. SecureCRT连接VMWare中Linux

    SecureCRT连接vmvare虚拟机ubuntu的前提条件1.   使用主机可以ping通虚拟机,或虚拟机可以ping通主机2.   虚拟机已经开启ssh服务,可以使用sudo apt-get i ...

  6. Appium 1.9.1 启动报错 Fatal TypeError: Class constructor BaseDriver cannot be invoked without 'new'

    安装了appium 1.9.1后一直报错Fatal TypeError: Class constructor BaseDriver cannot be invoked without 'new',无法 ...

  7. okhttp 特点 module版本冲突 集成module到项目

    特点适合大小文件上传.下载,但对图片不会执行缓存是一个缺点 集成module到项目 右上角添加 lib和module版本冲突问题,删除lib下的即可

  8. px sp dp 手机尺寸

  9. elasticsearch 简单聚合查询示例

    因为懒癌犯了,查询语句使用的截图而不是文字,导致了发布随笔的时候提示少于150字的随笔不能发布. 我就很郁闷了. 下面的查询都是前段时间工作中使用过的查询语句. 开始的时候是使用nodejs构建es查 ...

  10. SNMP服务安装 Centos6.8环境网络安装

    概念: snmp是英文“Simple Network Management Protocol”的缩写,意为:简单网络管理协议. snmp是目前最常用的环境管理协议. snmp被设计成与协议无关的. s ...