CTF加密与解密补充

 今天做了几道CTF加密解密题,在此贴一些CTF中常见的密码解密代码。由于之前总结过一些,详见:CTF加密与解密,因此本篇主要补充一些之前没提到的加密方式。


01248密码

原理

该密码使用1,2,4,8四个数字,其中0用来表示间隔,其他数字以加法表示,比如:28=10,124=7,18=9,再用 1->26 表示 A->Z转化即可。

代码

 
       
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
       
dict_ = {}
for i in xrange(1,27):
dict_[i]=chr(i+64)
def decode(str_):
str_new = ""
list_ = str_.split( "0")
for i in list_:
number = 0
for j in i:
number+=int(j)
str_new+=dict_.get(number)
return str_new
if __name__== "__main__":
str_ = "8842101220480224404014224202480122"
print decode(str_)

参考:https://wiki.x10sec.org/crypto/classical/others/#01248

QWE密码

原理

电脑键盘 QWE 加密法,就是用字母表替换键盘上面的排列顺序

CTF加密与解密补充_第1张图片

代码

 
       
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
       
str1= "QWERTYUIOPASDFGHJKLZXCVBNM"
str2= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def qwe_encode(en_str):
str3 = ""
for s in en_str:
str3=str3+str1[str2.index(s.upper())]
return str3
def qwe_decode(de_str):
str3 = ""
for s in de_str:
str3=str3+str2[str1.index(s.upper())]
return str3
if __name__== "__main__":
print qwe_decode( "OOSNGQCFTWLQIK")
print qwe_encode( "IILYOAVNEBSAHR")

参考:https://www.cnblogs.com/ssooking/p/6559935.html

希尔密码

原理

百度百科

代码

 
       
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
       
from numpy import *
Dic = {chr(i+97):i for i in range(26)}
def decode_2( pwd= 'dloguszijluswogaqy',org=[[1,2],[0,1]]):
'' ' 二维矩阵 ' ''
key=mat(org)
key1=key.I.T #密钥经过一次逆运算再做一次转置
finalans= ''
str2=[0 for i in range(len( pwd))]
for i in range(len( pwd)):
str2[i]=ord( pwd[i])-ord( 'a')+1
#将字符串转换为hill密码中的数字
num=len(str2)%4
for i in range(4-num):
str2.append(0)
#给上面得到数字进行补位,保证可以四个为一组,方便后面的计算
count=0
for i in range(len(str2)/4):
crypto1=mat([[str2[count],str2[count+1]],[str2[count+2],str2[count+3]]])
#以4个为一组,分别取出每一组密文
ans=(crypto1*key1)%26 #计算明文
ans2=array(ans) #这里的array是将ans转化为矩阵的标准形式,从而可以去出每一个数字
count+=4
for m in range(2):
for n in range(2):
finalans+=chr(int(ans2[m][n])+ord( 'a')-1)
#将明文转化为字符串
finalans = finalans.replace( "`", "")
return finalans
def decode_3( pwd= "wjamdbkdeibr", org=[[1,2,3],[4,5,6],[7,8,10]]):
'' ' 三维矩阵 ' ''
pwd = list( pwd)
org_ = matrix(array(org))
org = get_vmatrix(org_)
temp = []
result = []
while True:
if len( pwd) % 3 != 0:
pwd.append( pwd[-1])
else:
break
for i in pwd:
temp.append(Dic.get(i))
temp = array(temp)
temp = temp.reshape(len( pwd)/3, 3)
xx = matrix(temp)*org
for j in range(len( pwd)/3):
for i in range(3):
if (int(xx[j, i]) >= 26):
result.append(chr(xx[j, i] % 26 + 97))
else:
result.append(chr(xx[j, i] + 97))
return "".join(result)
def get_vmatrix(org):
org_adjoin = org.I*linalg.det(org)
org_det = int(str(abs(linalg.det(org))).split( '.')[0])
for i in range(1, 26):
if i * org_det % 26 == 1:
break
org_mod = -org_adjoin * i % 26
org_mod = matrix(org_mod)
temp = []
for i in range(org_mod.shape[0]):
for j in range(org_mod.shape[1]):
temp.append(int(str(org_mod[i, j]).split( '.')[0]))
org_final = matrix(temp).reshape(org_mod.shape[0], org_mod.shape[1])
return org_final
if __name__ == '__main__':
print decode_2( pwd= 'dloguszijluswogaqy',org=[[1,2],[0,1]])
print decode_3( pwd= "wjamdbkdeibr", org=[[1,2,3],[4,5,6],[7,8,10]])


【热门文章推荐】:


色情资源引发的百度网盘之战

浅谈XXE漏洞攻击与防御

当子域名遇上搜索引擎

安卓版Kali-linux搭建小记

利用chrome_remote_interface实现程序化、自动化Web安全测试

windows服务器信息收集工具

爬取搜索引擎之寻你千百度

端口扫描器的几种代码实现方案

利用python开发app实战

渗透神器系列-Metasploit




更多原创文章请扫描二维码,或点击“阅读原文”

CTF加密与解密补充_第2张图片      

个人技术博客地址: https://thief.one





你可能感兴趣的:(CTF加密与解密补充)