【Vigenère Cipher】
由于频率分析法可以有效的破解单表替换密码,法国密码学家维吉尼亚于1586年提出一种多表替换密码,
即维吉尼亚密码,也称维热纳尔密码。维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,
以此来对抗字频统计。
加密算法:例如密钥的字母为[d],明文对应的字母[b]。根据字母表的顺序[d]=4,[b]=2,那么密文就是[d]+[b]-1=4+2-1=5=[e],
因此加密的结果为[e]。解密即做此逆运算。
加密公式:密文 = (明文 + 密钥) Mod 26 - 1
解密公式:明文 = [26 + (密文 - 密钥)] Mod 26 + 1
也可以用查表法来进行加密:例如密钥的字母为[d],明文对应的字母[b],在下图的表格第一行找到字母"d"(深蓝色),
再在左边第一列找到字母"b"(绿色),两个字母的交叉点(b行d列)就是字母"E",所以对应的密文字母为[e]。
[-----------------图-----------------]
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
a 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 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
c 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 B
d D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
e E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
f F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
g G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
h H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
i I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
j J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
k K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
l L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
m M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
n N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
o O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
p P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
q Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
r R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
s S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
t T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
u U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
v V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
w W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
x X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
y Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
z Z 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
假如对如下明文加密:
to be or not to be that is the question
当选定“have”作为密钥时,加密过程是:密钥第一个字母为[h],明文第一个为[t],因此可以找到在h行t列中的字母[a],依此类推,
得出对应关系如下:
密钥:ha ve ha veh av eh aveh av eha vehaveha
明文:to be or not to be that is the question
密文:ao wi vr isa tj fl tcea in xoe lylsomvn
在线解密网站:维吉尼亚密码加密/解密 - 一个工具箱 - 好用的在线工具都在这里! (atoolbox.net)
猪圈密码在线解密平台:http://ctf.ssleye.com/pigpen.html
字母 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
数字 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
例如二进制:1110 10101 1101 10 101 10010 1111 1110 101
转为十进制:14 21 13 2 5 18 15 14 5
对应字母表:number
加密时为经常要对字符进行倒序处理。如果让你按abcdef...的顺序背出字母表的每个字母会很容易,
但是如果是zyxwvu...的顺序那就很难背出来了。一个很熟悉的单词,如果按相反的顺序拼写,可能就会感到很陌生。
例如“love”字母倒过来拼就是“evol”。
具体加密时倒序有很多种方案,需要灵活运用。例如:
每个单词的倒序:siht si a tset - this is a test
整句的倒序:tset a si siht - this is a test
数字的倒序:02 50 91 02 - 20 05 19 20(test)
单词之间的间隔一般使用空格。在加密时常常要去掉空格,但有时某些字母或数字来替代空格也不失为一种好的加密方案。
错误空格位置也会起到很强的误导作用。
例如:t hi sis at est - this is a test
关于词频问题的密码,我在这里提供英文字母的出现频率给大家,其中数字全部是出现的百分比:
a 8.2 b 1.5 c 2.8 d 4.3
e 12.7 f 2.2 g 2.0 h 6.1
i 7.0 j 0.2 k 0.8 l 4.0
m 2.4 n 6.7 o 7.5 p 1.9
q 0.1 r 6.0 s 6.3 t 9.1
u 2.8 v 1.0 w 2.4 x 0.2
y 2.0 z 0.1
词频法其实就是计算各个字母在文章中的出现频率,然后大概猜测出明码表,最后验证自己的推算是否正确。
这种方法由于要统计字母出现频率,需要花费时间较长。参考《跳舞的小人》和《金甲虫》。
也称棋盘密码,是利用波利比奥斯方阵(Polybius Square)进行加密的密码方式,产生于公元前两世纪的希腊,
相传是世界上最早的一种密码。
假设我们需要发送明文讯息 “Attack at once”, 用一套秘密混杂的字母表填满波利比奥斯方阵,像是这样:
A D F G X
A b t a l p
D d h o z k
F q f v s n
G g j c u x
X m r e w y
i和j视为同一个字,使字母数量符合 5 × 5 格。之所以选择这五个字母,是因为它们译成摩斯密码时不容易混淆,
可以降低传输错误的机率。使用这个方格,找出明文字母在这个方格的位置,再以那个字母所在的栏名称和列名称代替这个字母。
可将该讯息转换成处理过的分解形式。
明文:A T T A C K A T O N C E
密文:AF AD AD AF GF DX AF AD DF FX GF XF
A,D,F,G,X也可以用数字1,2,3,4,5来代替,这样密文就成了:
13 12 12 13 43 25 13 12 23 35 43 53
-------------------------------------------------------------------------
ADFGX
1918年,第一次世界大战将要结束时,法军截获了一份德军电报,电文中的所有单词都由A、D、F、G、X五个字母拼成,
因此被称为ADFGX密码。ADFGX密码是1918年3月由德军上校Fritz Nebel发明的,是结合了Polybius密码和置换密码的双重加密方案。
A、D、F、G、X即Polybius方阵中的前5个字母。
明文:A T T A C K A T O N C E
经过Polybius变换:AF AD AD AF GF DX AF AD DF FX GF XF
下一步,利用一个移位密钥加密。假设密钥是“CARGO”,将之写在新格子的第一列。再将上一阶段的密码文一列一列写进新方格里。
C A R G O
_________
A F A D A
D A F G F
D X A F A
D D F F X
G F X F X
最后,密钥按照字母表顺序“ACGOR”排序,再按照此顺序依次抄下每个字母下面的整列讯息,形成新密文。如下:
FAXDF ADDDG DGFFF AFAXX AFAFX
在实际应用中,移位密钥通常有两打字符那么长,且分解密钥和移位密钥都是每天更换的。
ADFGVX
在1918年6月,再加入一个字V扩充。变成以6×6格共36个字符加密。这使得所有英文字母(不再将I和J视为同一个字)以及数字0到9都可混合使用。
这次增改是因为以原来的加密法发送含有大量数字的简短信息有问题。
希尔密码就是矩阵乘法密码,运用基本矩阵论原理的替换密码。每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,
跟一个n×n的密钥矩阵相乘,再将得出的结果模26。希尔密码的优点是完全隐藏了字符的频率信息,弱点是容易被已知明文攻击击破。
加密
例如:密钥矩阵
1 3
0 2
明文:HI THERE
去空格,2个字母一组,根据字母表顺序换成矩阵数值如下,末尾的E为填充字元:
HI TH ER EE
8 20 5 5
9 8 18 5
HI 经过矩阵运算转换为 IS,具体算法参考下面的说明:
|1 3| 8 e1*8+3*9=35 MOD26=9 =I
|0 2| 9 e0*8+2*9=18 MOD26=18=S
用同样的方法把“HI THERE”转换为密文“IS RPGJTJ”,注意明文中的两个E分别变为密文中的G和T。
解密
解密时,必须先算出密钥的逆矩阵,然后再根据加密的过程做逆运算。
逆矩阵算法公式:
|A B| = 1/(AD-BC) * | D -B|
|C D| |-C A|
例如密钥矩阵=
|1 7|
|0 3|
AD-BC=1*3-0*7=3 3*X=1 mod26 所以 X=9
因此
|1 7| 的逆矩阵为: 9 * |3 -7|
|0 3| |0 1|
假设密文为“FOAOESWO”
FO AO ES WO
6 1 5 23
15 15 19 15
9* |3 -7| | 6| = 9*(3*6-7*15)=-783 mod26 = 23=W
|0 1| |15| = 9*(0*6+1*15)= 135 mod26 = 5 =E
所以密文“FOAOESWO”的明文为“WEREDONE”
-------------------------------------------------------------------------
Playfair将明文中的双字母组合作为一个单元对待,并将这些单元转换为双字母组合。
加密后的字符出现的频率在一定程度上被均匀化。
5*5变换矩阵(I或J视为同一字符):
C I P H E
R A B D F
G K L M N
O Q S T U
V W X Y Z
加密规则:按成对字母加密
相同对中的字母加分隔符(如x)
ballon -> ba lx lo on
同行取右边:he->ec
同列取下边:dm->mt
其他取交叉:kt->mq od->tr
例如:ballon -> ba lx lo on -> db sp gs ug
二战时德军使用过的一种密码,其实是利用了二进制的表示法来替代字母,有如下的表格作为基础:
A 1000001 B 1000010 C 1000011 D 1000100 E 1000101 F 1000110 G 1000111 H 1001000 I 1001001 J 1001010
K 1001011 L 1001100 M 1001101 N 1001110 O 1001111 P 1010000 Q 1010001 R 1010010 S 1010011 T 1010100
U 1010101 V 1010110 W 1010111 X 1011000 Y 1011001 Z 1011010
那么,比如我们要加密“Hello”,密钥用“study”,则以如下方式进行加密:
H E L L O = 1001000 1000101 1001100 1001100 1001111
S T U D Y = 1010011 1010100 1010101 1000100 1011001
加密原则:1+1=0,0+0=0,1+0=1
于是得密文:00110110010001001100100010000010110
那么解题目中的密文,需要遵循以下几个原则和步骤,
1,划分,即每七个数字为一组;
2,对应,找出密文每个字母对应的数字,再与上述数字对应;
3,转换,遵循上述加密原则,逆用即可;
4,解密,得出新的一组数字,对应字母,得出明文。
结尾有+,并且开头是U2FsdGVkX1/
密文 :U2FsdGVkX19mGsGlfI3nciNVpWZZRqZO2PYjJ1ZQuRqoiknyHSWeQv8ol0uRZP94
MqeD2xz+密钥:Rabbit
英文不变,中文变成%E7%BD%这些字符。经常浏览器搜索的时候可以见到,比如你百度搜索一共中文,然后复制网站,就会发现英文字母还是英文字母,中文字母全变成了%E7%BD这些。
然后百分号有的时候换成=,即=E7=BD类似的,只需要python把=换成%,再解码即可。
str='=E7=94=A8=E4=BD=A0=E9=82=A3=E7=81=AB=E7=83=AD=E7=9A=84=E5=98=B4=E5=94=87=E8=AE=A9=E6=88=91=E5=9C=A8=E5=8D=88=E5=A4=9C=E9=87=8C=E6=97=A0=E5=B0=BD=E7=9A=84=E9=94=80=E9=AD=82' print(str.replace('=','%'))
他就是一种特殊的移位密码。
最后一个字母代表第一个字母,倒数第二个字母代表第二个字母
但是注意:有的题目他区分大小写,有的题目他不区分大小写。
要是不区分大小写:就用工具即可,要是区分,用如下code
DIC_LOWER = "abcdefghijklmnopqrstuvwxyz" DIC_UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" DIC_LOWER_RE = DIC_LOWER[::-1] DIC_UPPER_RE = DIC_UPPER[::-1] def encrypt_atbash(string): ciphertext = "" for i in string: if i in DIC_LOWER: ciphertext += DIC_LOWER_RE[DIC_LOWER.index(i)] elif i in DIC_UPPER: ciphertext += DIC_UPPER_RE[DIC_UPPER.index(i)] else: ciphertext += i return ciphertext def decrypt_atbash(string): plaintext = "" for i in string: if i in DIC_LOWER_RE: plaintext += DIC_LOWER[DIC_LOWER_RE.index(i)] elif i in DIC_UPPER: plaintext += DIC_UPPER[DIC_UPPER_RE.index(i)] else: plaintext += i return plaintext if __name__ == '__main__': ciphertext_ = encrypt_atbash("HaHa") plaintext_ = decrypt_atbash("uozt{Zgyzhv_xlwv_uiln_xguhsld}") print(plaintext_)
U2Fsd开头的一般都为为AES、DES、3DES等算法。
特征一般都是小写的字母和数字混合,并且一眼就能看出来每个字符都是十六进制内的字符(0-9,a-f),这样的必为哈希值,比如这个:
a8db1d82db78ed452ba0882fb9554fc
找个在线网站一查即可:
MD5免费在线解密破解_MD5在线加密-SOMD5
CTF中那些脑洞大开的编码和加密 (hackfun.org)