前言

第一篇文章👉CTF中常见的密码学(一)⌒⭐](https://www.ibanqin.com/posts/7896669f.html))。

一.维吉尼亚密码

1.加密

维吉尼亚密码就是一些偏移量不同的凯撒密码组成的,首先需要如下表。

ABCDEFGHIJKLMNOPQRSTUVWXYZ
012345678910111213141516171819202122232425

假设密钥是TAKAGISAN,则对应上面👆表转换成数字密钥就是key=(19,0,10,0,6,8,18,0,13)

假设明文是TAKAGISAN IS THE FIRST IN THE WORLD,然后按照密钥分为九个一组,密钥数字排序如果不够,可以从头开始排序,如下表操作即可,假设下面对应的索引数字为a,密钥数字为b,那么加密之后的数字c就是(a+b)mod26取余数即可,最后在按照上表对应的数字排序即可得到密文。

明文TAKAGISANISTHEFIRSTINTHEWORLD
对应的索引数字19010068180138181974581718198131974221417113
密钥数字190100681801319010068180131901006818013190
加密之后的数字120200121610001183710130175128231913121414443
密文MAUAMQKAABSDHKNARFMIXTNMOOEED

所以TAKAGISAN IS THE FIRST IN THE WORLD加密之后的密文是MAUAMQKAABSDHKNARFMIXTNMOOEED。公式就是(a+b)mod26=c


2.解密

假设已经知道了密钥是TAKAGISAN密钥是key=(19,0,10,0,6,8,18,0,13),公式是(c-b)mod26=a,也就是对应的索引数字减去密钥数字再来mod26即可,如下表。

密文MAUAMQKAABSDHKNARFMIXTNMOOEED
对应的索引数字120200121610001183710130175128231913121414443
密钥数字190100681801319010068180131901006818013190
解密之后的数字19010068180138181974581718198131974221417113
明文TAKAGISANISTHEFIRSTINTHEWORLD

二.摩斯电码

当然也是字符对应字母,如下表

字母表

字符电码符号字符电码符号字符电码符号字符电码符号
A.-B-…C-.-.D-..
E.F..-.G—.H….
I..J.—-K-.-L.-..
MN-.O—-P.—.
U..-V…-W.—X-..-
Y-.—Z—..

标点符号

字符电码符号字符电码符号字符电码符号字符电码符号
..-.-.-:—-…,—..—;-.-.-.
?..—..=-…-.——/-..-.
!-.-.—--….--..—.-.-..-.
(-.—.)-.—.-$…-..-&….
@.—.-.+.-.-.

数字长码

字符电码符号字符电码符号字符电码符号字符电码符号
0——-1.——2..—-3…—
4….-5…..6-….7—…
8—-..9——.

在线解密网址👉摩斯电码在线解密


三.MD5(哈希算法)

MD5不可逆,只能通过枚举,MD5的特征是,(1)长度固定,(2)只可能小写和数字32个字符👉在线CMD加密解密,比如加密123456,如下。

MD5:e10adc3949ba59abbe56e057f20f883e


四.猪圈密码

用格子来做的简单替换,加密,如下图格子适应,和对应图。

如下是字母对应图👇。

按照图表来加密解密即可。


五.九宫格按键加密

也是简单的替换密码,如下表替换。

12 abc3 def
4 ghi5 jkl6 mno
7 pqrs8 tuv9 wxyz

没有1,比如a在第二个格子那么就是21z在第9个格子就是94k在第五个格子就是52


六.26键加密

1.QWE密码

指的是按照QWE键盘顺序来加密也就是QWERTYUIOP这种,如下表所示。

ABCDEFGHIJKLMNOPQRSTUVWXYZ
QWERTYUIOPASDFGHJKLZXCVBNM

入👆表加密即可。

2.坐标加密

先如下图所示,如果是(红色,黄色)也就是先行后列的顺序,(1,1)=Q,(1,2)=W,(2,1)=A,(2,2)=S

如果是(黄色,红色)也就是先列后行的顺序,(1,1)=Q,(1,2)=A,(2,1)=W,(2,2)=S


七.曲路密码

也是一种换位密码,需要双方事先约定好密钥(曲路路线)

假设明文是Takagisan is the best in the world

填入4行七列表(需要事先约定好)

Takagis
anisthe
bestint
heworld

如下图👇加密回环路线,从右往左(需要事先声明好),最终加密效果就是,dtesihnlritgastowsjkaneehbat,解密也非常简单,按照约定,4行7列,回环路线从右往左,密文从左到右,重新排序即可。


八.当铺密码

当铺密码就是中文与数字的结合,当前的汉字有多少笔画出头,就是转换成数字几。

如下表,就是当铺密码所对应的汉字和所对应的数字。

汉字所对应的数字
1
2
3
4
5
6
7
8
9

比如夫大 工大 夫井,就是75 45 78,对应ASCII码就是KEN


九.培根密码加密方式

第一种方法如下表

字母加密后字母加密后字母加密后字母加密后字母加密后字母加密后字母加密后字母加密后字母加密后字母加密后
AaaaaaBaaaabCaaabaDaaabbEaabaaFaababGaabbaHaabbbIabaaaJabaab
KababaLababbMabbaaNabbabOabbbaPabbbbQbaaaaRbaabSbaabaTbaabb
UbabaaVbababWbabbaXbabbbYbbaaaZbbaab

第二种方法如下表

字母加密后字母加密后字母加密后字母加密后
aAAAAAgAABBAnABBAAtBAABA
bAAAABhAABBBoABBABu-vBAABB
cAAABAi-jABAAApABBBAwBABAA
dAAABBAkABAABqABBBBxBABAB
eAABAAlABABArBAAAAyBABBA
fAABABmABABBsBAAABzBABBB

加密解密python程序如下👇,源自于网络,自己经过了一些修改。

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
import re

alphabet = ['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']

first_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","babaa","babab","babba","babbb","bbaaa","bbaab"]

second_cipher = ["aaaaa","aaaab","aaaba","aaabb","aabaa","aabab","aabba","aabbb","abaaa","abaaa","abaab","ababa","ababb","abbaa","abbab","abbba","abbbb","baaaa","baaab","baaba","baabb","baabb","babaa","babab","babba","babbb"]

def encode():
string = input("请输入字符来加密:\n")
e_string1 = ""
e_string2 = ""
for index in string:
for i in range(0,26):
if index == alphabet[i]:
e_string1 += first_cipher[i]
e_string2 += second_cipher[i]
break
print("第一种加密方式结果是:\n"+e_string1)
print("第二种加密方式结果是:\n"+e_string2)
return

def decode():
e_string = input("请输入字符来解密:\n")
e_array = re.findall(".{5}",e_string)
d_string1 = ""
d_string2 = ""
for index in e_array:
for i in range(0,26):
if index == first_cipher[i]:
d_string1 += alphabet[i]
if index == second_cipher[i]:
d_string2 += alphabet[i]
print("第一种解密结果是:\n"+d_string1)
print("第二种解密结果是:\n"+d_string2)
return

if __name__ == '__main__':
while True:
print("\t*******培根密码加密解密*******")
print("输入应该是小写密码只包含ab")
print("1.加密\n2.解密\n3.退出")
s_number = input("请输入数字来选择\n")
if s_number == "1":
encode()
input()
elif s_number == "2":
decode()
input()
elif s_number == "3":
exit()
else:
continue

十.RSA算法加密

RSA算法,应该算难的一种了,视频可以去看李永乐老师的👉李永乐老师讲RSA,首先需要知道的东西如下👇。

1
2
3
4
5
6
7
8
9
10
1.两个质数:p q(只有1和他本身两个约数的数叫做质数)
2.n=p*q
3.φ(n) = (p-1)(q-1) 欧拉函数
4.公钥e是一个1<e<φ(n)的整数,e和φ(n)必须要互质
私钥d 必须是(e*d)modφ(n)=1,假设φ(n)是20,那
e取值为3,d取值为7,就是(3*7)mod20=1,余数就
可以是1,那么私钥就可以是为7。

5.加密,假设M是明文,m的e的平方除以n余数就是c
6.解密,C为密文,同时私钥d,c的d次方除以n余数就是m

看懂如上即可看不懂怎么办,我也看不懂,如下的带数操作。

1
m=14	e=3		p=5		q=11	请写出RSA加密解密过程和结果

求n:pq=5\11=55

求φ(n):φ(n)=(p-1)*(q-1)=(5-1)(11-1)=40

求d:已知求d公式为(e*d)modφ(n)=1,就是(3*d)mod40=1,算出d为27。

加密:已知公式为(m^e)modn=c套用(14^3)mod55=c,算出c为49

解密:已知公式为(c^d)modn=m套用(49^27)mod55=m,算出m为14

第二测试题如下👇

1
p=43	q=59	e=13	m=134879475204	用RSA对m进行加密

加密公式为(m^e)modn=c,我们需要知道e和n即可算出c。

求n:n=pq=43\59=2537

加密m:(134879475204^e)mod2537=1202


未完待续…..