前言
第一篇文章👉CTF中常见的密码学(一)。
一.维吉尼亚密码
1.加密
维吉尼亚密码就是一些偏移量不同的凯撒密码组成的,首先需要如下表。
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 |
假设密钥是TAKAGISAN
,则对应上面👆表转换成数字密钥就是key=(19,0,10,0,6,8,18,0,13)
。
假设明文是TAKAGISAN IS THE FIRST IN THE WORLD
,然后按照密钥分为九个一组,密钥数字排序如果不够,可以从头开始排序,如下表操作即可,假设下面对应的索引数字为a
,密钥数字为b
,那么加密之后的数字c
就是(a+b)mod26
取余数即可,最后在按照上表对应的数字排序即可得到密文。
明文 | T | A | K | A | G | I | S | A | N | I | S | T | H | E | F | I | R | S | T | I | N | T | H | E | W | O | R | L | D |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
对应的索引数字 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 8 | 18 | 19 | 7 | 4 | 5 | 8 | 17 | 18 | 19 | 8 | 13 | 19 | 7 | 4 | 22 | 14 | 17 | 11 | 3 |
密钥数字 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 |
加密之后的数字 | 12 | 0 | 20 | 0 | 12 | 16 | 10 | 0 | 0 | 1 | 18 | 3 | 7 | 10 | 13 | 0 | 17 | 5 | 12 | 8 | 23 | 19 | 13 | 12 | 14 | 14 | 4 | 4 | 3 |
密文 | M | A | U | A | M | Q | K | A | A | B | S | D | H | K | N | A | R | F | M | I | X | T | N | M | O | O | E | E | D |
所以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即可,如下表。
密文 | M | A | U | A | M | Q | K | A | A | B | S | D | H | K | N | A | R | F | M | I | X | T | N | M | O | O | E | E | D |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
对应的索引数字 | 12 | 0 | 20 | 0 | 12 | 16 | 10 | 0 | 0 | 1 | 18 | 3 | 7 | 10 | 13 | 0 | 17 | 5 | 12 | 8 | 23 | 19 | 13 | 12 | 14 | 14 | 4 | 4 | 3 |
密钥数字 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 19 | 0 |
解密之后的数字 | 19 | 0 | 10 | 0 | 6 | 8 | 18 | 0 | 13 | 8 | 18 | 19 | 7 | 4 | 5 | 8 | 17 | 18 | 19 | 8 | 13 | 19 | 7 | 4 | 22 | 14 | 17 | 11 | 3 |
明文 | T | A | K | A | G | I | S | A | N | I | S | T | H | E | F | I | R | S | T | I | N | T | H | E | W | O | R | L | D |
二.摩斯电码
当然也是字符对应字母,如下表
字母表
字符 | 电码符号 | 字符 | 电码符号 | 字符 | 电码符号 | 字符 | 电码符号 |
---|---|---|---|---|---|---|---|
A | .- | B | -… | C | -.-. | D | -.. |
E | . | F | ..-. | G | –. | H | …. |
I | .. | J | .— | K | -.- | L | .-.. |
M | – | N | -. | 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
。
四.猪圈密码
用格子来做的简单替换,加密,如下图格子适应,和对应图。
如下是字母对应图👇。
按照图表来加密解密即可。
五.九宫格按键加密
也是简单的替换密码,如下表替换。
1 | 2 abc | 3 def |
---|---|---|
4 ghi | 5 jkl | 6 mno |
7 pqrs | 8 tuv | 9 wxyz |
没有1,比如a
在第二个格子那么就是21
,z
在第9个格子就是94
,k
在第五个格子就是52
。
六.26键加密
1.QWE密码
指的是按照QWE键盘顺序来加密也就是QWERTYUIOP这种,如下表所示。
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 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Q | W | E | R | T | Y | U | I | O | P | A | S | D | F | G | H | J | K | L | Z | X | C | V | B | N | M |
入👆表加密即可。
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行七列表(需要事先约定好)
T | a | k | a | g | i | s |
---|---|---|---|---|---|---|
a | n | i | s | t | h | e |
b | e | s | t | i | n | t |
h | e | w | o | r | l | d |
如下图👇加密回环路线,从右往左(需要事先声明好),最终加密效果就是,dtesihnlritgastowsjkaneehbat
,解密也非常简单,按照约定,4行7列,回环路线从右往左,密文从左到右,重新排序即可。
八.当铺密码
当铺密码就是中文与数字的结合,当前的汉字有多少笔画出头,就是转换成数字几。
如下表,就是当铺密码所对应的汉字和所对应的数字。
汉字 | 所对应的数字 |
---|---|
由 | 1 |
中 | 2 |
人 | 3 |
工 | 4 |
大 | 5 |
王 | 6 |
夫 | 7 |
井 | 8 |
羊 | 9 |
比如夫大 工大 夫井
,就是75 45 78
,对应ASCII码就是KEN
。
九.培根密码加密方式
第一种方法如下表
字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
A | aaaaa | B | aaaab | C | aaaba | D | aaabb | E | aabaa | F | aabab | G | aabba | H | aabbb | I | abaaa | J | abaab |
K | ababa | L | ababb | M | abbaa | N | abbab | O | abbba | P | abbbb | Q | baaaa | R | baab | S | baaba | T | baabb |
U | babaa | V | babab | W | babba | X | babbb | Y | bbaaa | Z | bbaab |
第二种方法如下表
字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 | 字母 | 加密后 |
---|---|---|---|---|---|---|---|
a | AAAAA | g | AABBA | n | ABBAA | t | BAABA |
b | AAAAB | h | AABBB | o | ABBAB | u-v | BAABB |
c | AAABA | i-j | ABAAA | p | ABBBA | w | BABAA |
d | AAABBA | k | ABAAB | q | ABBBB | x | BABAB |
e | AABAA | l | ABABA | r | BAAAA | y | BABBA |
f | AABAB | m | ABABB | s | BAAAB | z | BABBB |
加密解密python程序如下👇,源自于网络,自己经过了一些修改。
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.两个质数: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
看懂如上即可看不懂怎么办,我也看不懂,如下的带数操作。
m=14 e=3 p=5 q=11 请写出RSA加密解密过程和结果
求n:p*q=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
第二测试题如下👇
p=43 q=59 e=13 m=134879475204 用RSA对m进行加密
加密公式为(m^e)modn=c
,我们需要知道e和n即可算出c。
求n:n=p*q=43*59=2537
加密m:(134879475204^e)mod2537=1202
未完待续…..