前言
參考,我們?nèi)握n老師的WORD和PPT,結(jié)合自己的理解,在結(jié)合網(wǎng)上文章的理解。
一.BASE64編碼
BASE64編碼中,特征和所擁有的字符字母:A-Z a-z;數(shù)字:0-9;符號(hào):+ /
,然后末尾經(jīng)常有一個(gè)“=”或者兩個(gè)“==”。
原理,先把需要加密的字符串每個(gè)字符轉(zhuǎn)換成ASCII碼,然后ASCII碼轉(zhuǎn)換成二進(jìn)制為8位二進(jìn)制數(shù)字表示,然后在以六位二進(jìn)制為一組轉(zhuǎn)十進(jìn)制,最后查找對(duì)應(yīng)的BASE64對(duì)照表即可。
ASCII表,常用的無(wú)非就是大寫(xiě)字母和小寫(xiě)字母,大寫(xiě)字母的A
開(kāi)始是97
,小寫(xiě)字母的a
開(kāi)始是65
,推算下即可。
比如,這里需要加密“Ken”這個(gè)字符串,里面有大寫(xiě)和小寫(xiě),查找ASCII碼表,分別對(duì)應(yīng)的是75 101 110
,轉(zhuǎn)換成二進(jìn)制75:01001011; 101:01100101; 110:01101110;
,先并排在一起,就是010010110110010101101110,然后在以六個(gè)為一組排序??010010 | 110110 | 010101 | 101110,將這六個(gè)二進(jìn)制重新轉(zhuǎn)換成十進(jìn)制,分別對(duì)應(yīng)的是,18 54 21 46
,然后對(duì)應(yīng)base64碼表,找出對(duì)應(yīng)的上面重新轉(zhuǎn)換成的十進(jìn)制數(shù)字即可,分別是??S2Vu,所以Ken這個(gè)字符串BASE64加密編碼之后是S2Vu
,如果不太清楚,看如下表格。
文本 | K | e | n | NULL |
---|---|---|---|---|
ASCII編碼 | 75 | 101 | 110 | NULL |
二進(jìn)制位 | 01001011 | 01100101 | 01101110 | NULL |
分組 | 010010 | 110110 | 010101 | 101110 |
轉(zhuǎn)換后的十進(jìn)制&BASE64碼表索引 | 18 | 54 | 21 | 46 |
結(jié)果&Base64碼表 | S | 2 | V | u |
這樣應(yīng)該就差不多了,附上BASE64索引表,如下
數(shù)值 | 字符 | 數(shù)值 | 字符 | 數(shù)值 | 字符 | 數(shù)值 | 字符 | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | A | 16 | Q | 32 | g | 48 | w | |||
1 | B | 17 | R | 33 | h | 49 | x | |||
2 | C | 18 | S | 34 | i | 50 | y | |||
3 | D | 19 | T | 35 | j | 51 | z | |||
4 | E | 20 | U | 36 | k | 52 | 0 | |||
5 | F | 21 | V | 37 | l | 53 | 1 | |||
6 | G | 22 | W | 38 | m | 54 | 2 | |||
7 | H | 23 | X | 39 | n | 55 | 3 | |||
8 | I | 24 | Y | 40 | o | 56 | 4 | |||
9 | J | 25 | Z | 41 | p | 57 | 5 | |||
10 | K | 26 | a | 42 | q | 58 | 6 | |||
11 | L | 27 | b | 43 | r | 59 | 7 | |||
12 | M | 28 | c | 44 | s | 60 | 8 | |||
13 | N | 29 | d | 45 | t | 61 | 9 | |||
14 | O | 30 | e | 46 | u | 62 | + | |||
15 | P | 37 | f | 47 | v | 63 | / |
在附上一張ASCII碼表圖,如下圖,圖來(lái)自于網(wǎng)絡(luò)。
1.有等號(hào)"="的情況
比如a
這個(gè)字母,ASCII碼是65
,轉(zhuǎn)換成二進(jìn)制是01000001,轉(zhuǎn)換成六個(gè)一組010000 | 01,就會(huì)發(fā)現(xiàn)后面不足以組成六位數(shù),就可以在后面添零,就變成了??010000 | 010000,轉(zhuǎn)換成十進(jìn)制就是16
,然后根據(jù)BASE64碼表對(duì)應(yīng)的是Q
,那么a的加密后就是QQ
,但是我自己的理解是,加密后的長(zhǎng)度也就是編碼后的長(zhǎng)度必須能整除4
,才可以,這里QQ不能整除4
所以不行,就可以加上=
,長(zhǎng)度就可以了,所以最終的編碼就是QQ==
。
另外一種理解,如果要進(jìn)行編碼的字符串,不能被3整除,后面會(huì)多出一個(gè)字節(jié)或者兩個(gè)字節(jié)
,就可以使用“”來(lái)代替,比如編碼a
,不能被三整除,還差兩位就可以被三整除,就可以在最終編碼結(jié)果加上兩個(gè)"",結(jié)合如下圖理解更好。
二.base32加密
和base64加密差不多,這里直接舉例子,先看下表是base32的索引表,比如這里我要BASE32編碼,Ken
,對(duì)應(yīng)的ASCII碼分別是,75 101 110
,轉(zhuǎn)換成二進(jìn)制分別對(duì)應(yīng)的是75:01001011; 101:01100101; 110:01101110
,然后合在一起,是0100101101100101011011100,然后在以五個(gè)一組排序??01001 | 01101 | 10010 | 10110 | 11100,然后在轉(zhuǎn)換成十進(jìn)制就是,9 13 18 22 28
,根據(jù)下面的索引表,就是,JNSW4
,這里只有五個(gè)數(shù),必須要四個(gè)四個(gè)一組,不足四個(gè)就用=
,來(lái)填充,所以就是JNSW4===
。
數(shù)值 | 字符 | 數(shù)值 | 字符 | 數(shù)值 | 字符 | 數(shù)值 | 字符 | |||
---|---|---|---|---|---|---|---|---|---|---|
0 | A | 9 | J | 18 | S | 27 | 3 | |||
1 | B | 10 | K | 19 | T | 28 | 4 | |||
2 | C | 11 | L | 20 | U | 29 | 5 | |||
3 | D | 12 | M | 21 | V | 30 | 6 | |||
4 | E | 13 | N | 22 | W | 31 | 7 | |||
5 | F | 14 | O | 23 | X | |||||
6 | G | 15 | P | 24 | Y | |||||
7 | H | 16 | Q | 25 | Z | |||||
8 | I | 17 | R | 26 | 2 |
可以看如下表格
文本 | K | e | n | NULL | NULL |
---|---|---|---|---|---|
ASCII編碼 | 75 | 101 | 110 | NULL | NULL |
二進(jìn)制位 | 01001011 | 01100101 | 01101110 | NULL | NULL |
分組 | 01001 | 01101 | 10010 | 10110 | 11100 |
分組后的十進(jìn)制 | 9 | 13 | 18 | 22 | 28 |
索引值 | J | N | S | W | 4 |
三.base16加密
如果理解了,base64加密和base32加密方式,那么base16加密方式就很好理解了,先看如下base16索引表。
數(shù)值 | 字符 | 數(shù)值 | 字符 | |
---|---|---|---|---|
0 | 0 | 8 | 8 | |
1 | 1 | 9 | 9 | |
2 | 2 | 10 | A | |
3 | 3 | 11 | B | |
4 | 4 | 12 | C | |
5 | 5 | 13 | D | |
6 | 6 | 14 | E | |
7 | 7 | 15 | F |
先還是和base64和base32一樣將需要加密的字符串轉(zhuǎn)換成ASCII碼然后轉(zhuǎn)換成二進(jìn)制,區(qū)別就是分組排序的時(shí)候是以4個(gè)為一組來(lái)排序,base64是六個(gè)為一組,base32是以五個(gè)為一組,如下圖理解即可,圖來(lái)自CSDN。
四.Unicode編碼
特征是以\u數(shù)字或者字母加數(shù)字
,比如,\u6211,轉(zhuǎn)換中文就是“我”,\u
過(guò)后是每四個(gè)為一組,最簡(jiǎn)單解碼方式可以使用python的print函數(shù)輸出即可,編碼??**\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064**,解碼效果如下圖??,成功解碼出字符串Hello World
上面是解密,加密如下。
編碼原理,先將需要加密的字符轉(zhuǎn)換成ASCII編碼,然后把ASCII編碼轉(zhuǎn)換成十六進(jìn)制即可,不足四位前面添0即可,比如a
這個(gè)字符,編碼之后是0x61,就需要加零就是0x0061,如下是python實(shí)現(xiàn),非常簡(jiǎn)單。
最重要的就是ord函數(shù)和hex函數(shù),ord函數(shù)把字符轉(zhuǎn)ASCII,然后hex把數(shù)字轉(zhuǎn)十六進(jìn)制。
str='flag'
dict = []
for i in str:
result = hex(ord(i)).replace(r'0x',r'\u')
dict.append(result)
print("".join(dict))
五.URL編碼
在瀏覽器地址欄經(jīng)常能看見(jiàn),特征是%數(shù)字加字母
,比如??**%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C**,這種類(lèi)型的,解碼之后的原文是,你好世界,還是需要用到python,當(dāng)然也可以在線(xiàn)編碼解碼,需要用到的是python的urllib
模塊下面的parse
模塊,如下代碼。
quote是編碼
import urllib.parse as url
str = '你好世界'
print(url.quote(str))
輸入效果如下
%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C
如何解碼,如下python代碼。
import urllib.parse as url
str = '%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C'
print(url.unquote(str))
解碼效果為你好世界
六.進(jìn)制轉(zhuǎn)換
1.python實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換
1.十進(jìn)制轉(zhuǎn)二進(jìn)制
可以用到一個(gè)函數(shù)bin函數(shù),可以之間轉(zhuǎn)換,如下代碼。
print(bin(10))
輸出結(jié)果是0b1010
2.二進(jìn)制轉(zhuǎn)十進(jìn)制
可以用到一個(gè)int函數(shù),如下代碼,int函數(shù)里面的2代表的是進(jìn)制。
str = '1010'
print(int(str,2))
輸出的數(shù)字是10
。
3.十進(jìn)制轉(zhuǎn)八進(jìn)制
需要用到一個(gè)oct函數(shù),如下代碼。
print(oct(100))
輸入結(jié)果是0o144
4.八進(jìn)制轉(zhuǎn)十進(jìn)制
和上面二進(jìn)制轉(zhuǎn)十進(jìn)制差不多,如下代碼,只需要更改數(shù)字即可
str = '144'
print(int(str,8))
5.十進(jìn)制轉(zhuǎn)十六進(jìn)制
需要用到一個(gè)hex函數(shù),如下代碼。
print(hex(255))
輸出結(jié)果是0xff
,十六進(jìn)制轉(zhuǎn)換十進(jìn)制和上面差不多,只需要更改數(shù)字即可。
2.手算進(jìn)制
可以直接參考百度百科??進(jìn)制轉(zhuǎn)換。
七.置換密碼
1.加密
1.明文:State Key Laboratory of Networking and Switching
2.加密密鑰:key=(1,5,6,2,3)
3.將明文分組,按照六個(gè)字母一組來(lái)分,總共可以分為七組,不足六個(gè)字母的可以用雙方事先規(guī)定好的字符來(lái)填充比如空格,如下是分組過(guò)后的樣子??。
P = (StateK)(eyLabo)(ratory)(ofNetw)(orking)(andSwi)(tching)
4.對(duì)每組字符進(jìn)行加密,根據(jù)加密密鑰key,把每組的第1位字符放在第5位字符上面,第5位字符放在第6位字符上面,第6位字符放在第2位字符上面,第2位字符放在第3位字符上面,第3位字符放在第1位字符上面,這樣排序即可,如下??。
P = (aKttSe)(Loyaeb)(tyaorr)(Nwfeot)(kgrion)(dinSaw)(hgcitn)
最終密文就是aKttSeLoyaebtyaorrNwfeotkgriondinSawhgcitn
2.解密
解密需要的是把密鑰給反向過(guò)來(lái),原本的密鑰是(1,5,6,2,3)
需要逆置換變成(1,3,2,6,5)
,然后在按照加密的方法即可解密。
八.柵欄密碼
柵欄密碼潛規(guī)則,字符不會(huì)超過(guò)30個(gè)。
1.加密
假設(shè)明文是:THEREISACIPHER
,然后根據(jù)上下上下排序,就是
T E E S C P E
H R I A I H R
最后連在一起就是TEESCPEHRIAIHR。
加密的另外一種方法,明文是THEREISACIPHER
,先兩個(gè)兩個(gè)分一組,就是,TH ER EI SA CI PH ER
。
先取出第一個(gè)字母:TEESCPE
在取出第二個(gè)字母:HRIAIHR
最后連在一起即可。
2.解密
加密密文:TEESCPEHRIAIHR
解密只需要將密文從中間分開(kāi),變位兩行。
T E E S C P E
H R I A I H R
最后在上下上下組合起來(lái)即可。
THEREISACIPHER
九.單表代換密碼
假設(shè)明文是:helloWorld
假設(shè)密鑰是:KENSSB
,去掉重復(fù)的字母就是KENSB
,然后按照字母順序排列剩余的字母即可得到一個(gè)方陣表,如下表。
K | E | N | S | B |
---|---|---|---|---|
A | C | D | F | G |
H | I | J | L | M |
O | P | Q | R | T |
U | V | W | X | Y |
Z |
然后在從左邊下邊開(kāi)始一直到右邊排序,即可得到代換密文,代換密碼表如下表所示。
明文字母 | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
密文字母 | K | A | H | O | U | Z | E | C | I | P | V | N | D | J | Q | W | S | F | L | R | X | B | G | M | T | Y |
然后按照,明文字母所對(duì)應(yīng)的密文字母,找到排序即可,helloword
加密之后的密文是CUNNQGQFNO
十.埃特巴什碼
最后一個(gè)字母代表的十第一個(gè)字母,倒數(shù)第二個(gè)字母代表的十第二個(gè)字母,如下表所示。
明文字母 | 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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
密文字母 | Z | Y | X | W | V | U | T | S | R | Q | P | O | N | M | L | K | J | I | H | G | F | E | D | C | B | A |
十一.凱撒密碼
根據(jù)如下表排序,如下表是最基礎(chǔ)的凱撒密碼,就是往右移位,A對(duì)應(yīng)的B,B對(duì)應(yīng)的是C,比如明文是KEN,那么按照下表密文對(duì)應(yīng)的就是LFO。
明文字母 | 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 | 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 |
python代碼如下,1代表的是移位。
def caser():
flag = 'HelloWorld'.upper()
dict_txt = 'abcdefghijklmnopqrstuvwxyz'.upper()
dec = []
for i in flag:
dec.append(dict_txt[dict_txt.index(i)+1])
print("".join(dec))
if __name__ == '__main__':
caser()
十二.仿射密碼
原理是,先將26個(gè)字母按照0-25排序也就是(0,1,2,3…25),密鑰為k(a,b),加密公式為c=Ea,b(m)≡am+b(mod26)
,解密公式為m=Da,b(c)≡a-1(c-b)(mod26)
。
如下表是字母索引表
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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 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 |
1.加密
例如我這里要加密helloworld加密過(guò)程并且密鑰是k(7,21):
h=7,7*7+21(mod26)=18,h=s
e=4,7*4+21(mod26)=23,e=x
l=11,7*11+21(mod26)=20,l=u
l=11,7*11+21(mod26)=20,l=u
o=14,7*14+21(mod26)=15,o=p
w=22,7*22+21(mod26)=19,w=t
o=14,7*14+21(mod26)=15,o=p
r=17,7*17+21(mod26)=10,r=k
l=11,7*11+21(mod26)=20,l=u
d=3,7*3+21(mod26)=16,d=q
所以helloworld加密之后的成果是sxuuptpkuq
。
2.解密
知道解密公式是m=Da,b(c)≡a-1(c-b)(mod26)&m=D7,21(c)≡7-1(c-21)(mod26)
,密文是sxuuptpkuq
,解密過(guò)程如下。
s=18,7^-1*(18-21)(mod26)
x=23,7^-1*(23-21)(mod26)
省略。。。。
3.python代碼
如下是加密代碼。
def affine_cipher_en():
flag = input('請(qǐng)輸入你要加密的明文:')
k_a = int(input("請(qǐng)輸入密鑰中的第一個(gè)值a:"))
k_b = int(input("請(qǐng)輸入密鑰中的第一個(gè)值b:"))
flag_list = list(flag.lower())
flag_en = []
for i in flag_list:
flag_en.append(chr(((k_a * (ord(i)-97) + k_b) % 26)+97))
print(''.join(flag_en))
affine_cipher_en()
如下是python解密代碼
#解密腳本
def affine_cipher_de():
flag = input('請(qǐng)輸入你要解密的明文:')
k_a = int(input("請(qǐng)輸入密鑰中的第一個(gè)值a:"))
k_b = int(input("請(qǐng)輸入密鑰中的第一個(gè)值b:"))
flag_list = list(flag.lower())
flag_de = []
for i in flag_list:
flag_de.append(chr((15 * (ord(i) - 97 - k_b)) % 26 + 97))
print(''.join(flag_de))
十三.棋盤(pán)密碼
棋盤(pán)密碼就是將26個(gè)字母放在5x5的方格子里面,ij放在一個(gè)格子里面,具體如下表??。
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
1 | a | b | c | d | e |
2 | f | g | h | i/j | k |
3 | l | m | n | o | p |
4 | q | r | s | t | u |
5 | v | w | x | y | z |
其中特點(diǎn)就是每?jī)蓚€(gè)數(shù)字編做一組,所有的數(shù)字都在1-5之間浮動(dòng),并且是先列后行的順序排序。
比如25 15 33
,所對(duì)應(yīng)的就是Ken
十四.普萊費(fèi)爾密碼
假設(shè)密鑰是kensb
,那么排序之后如下表,前面和單表代換一樣,假設(shè)明文是stegab
k | e | n | s | b |
---|---|---|---|---|
A | C | D | F | G |
H | I/J | L | M | O |
P | Q | R | T | U |
V | W | X | Y | Z |
加密原理就是如果假設(shè)需要加密明文里面的s對(duì)應(yīng)的是p1,t對(duì)應(yīng)的是p2,
1.那么p1,p2在同一行則對(duì)應(yīng)的密文就是緊靠p1,p2右端的字母。
2.如果p1,p2在同一列則對(duì)應(yīng)的密文分別是僅靠p1,p2下端的字母。
3.如果p1,p2不在同一列也不再同一行,那么對(duì)應(yīng)的密文應(yīng)該是p1,p2為對(duì)角頂點(diǎn)確定的矩陣的另外的兩個(gè)頂點(diǎn)字母,按照同行原則對(duì)應(yīng)。
加密效果如下表。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-410811.html
st | eg | ab |
---|---|---|
FY | BC | GK |
解密就是加密過(guò)程。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-410811.html
到了這里,關(guān)于CTF中常見(jiàn)密碼學(xué)(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!