古典密码-代换密码

8064

对古典密码学中代换密码做个粗浅的了解

代换密码分为单表代换和多表代换

一、单表代换在单表替换加密中,所有的加密方式几乎都有一个共性,那就是明密文一一对应。所以说,一般有以下两种方式来进行破解

1.凯撒密码凯撒密码(Caesar)加密时会将明文中的 每个字母 都按照其在字母表中的顺序向后(或向前)移动固定数目(循环移动)作为密文

eg:偏移量为3

12明文:ABCDEFGHIJKLMNOPQRSTUVWXYZ密文:DEFGHIJKLMNOPQRSTUVWXYZABC

根据偏移量的不同,还存在若干特定的恺撒密码名称:

偏移量为 10: Avocat (A→K)

偏移量为 13: ROT13

偏移量为 -5: Cassis (K 6)

偏移量为 -6: Cassette (K 7)

加密脚本:

1234567891011121314151617181920212223242526272829def encrypt_caesar_cipher(plaintext): def shift(text, n): result = "" for char in text: if char.isalpha(): shift = ord(char) + n if char.islower(): if shift > ord("z"): shift -= 26 elif shift < ord("a"): shift += 26 elif char.isupper(): if shift > ord("Z"): shift -= 26 elif shift < ord("A"): shift += 26 result += chr(shift) else: result += char return result print("尝试所有可能的位移:") for i in range(1, 26): print(f"位移 {i}: {shift(plaintext, +i)}")if __name__ == "__main__": plaintext = input("请输入凯撒密码的明文:") encrypt_caesar_cipher(plaintext)

解密脚本:

1234567891011121314151617181920212223242526272829def decrypt_caesar_cipher(ciphertext): def shift(text, n): result = "" for char in text: if char.isalpha(): shift = ord(char) + n if char.islower(): if shift > ord("z"): shift -= 26 elif shift < ord("a"): shift += 26 elif char.isupper(): if shift > ord("Z"): shift -= 26 elif shift < ord("A"): shift += 26 result += chr(shift) else: result += char return result print("尝试所有可能的位移:") for i in range(1, 26): print(f"位移 {i}: {shift(ciphertext, -i)}")if __name__ == "__main__": ciphertext = input("请输入凯撒密码的密文:") decrypt_caesar_cipher(ciphertext)

2.Atbash Cipher埃特巴什码(Atbash Cipher),它使用字母表中的最后一个字母代表第一个字母,倒数第二个字母代表第二个字母。

12明文: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

加密例子:

12明文:the quick brown fox jumps over the lazy dog密文:gsv jfrxp yildm ulc qfnkh levi gsv ozab wlt

工具:实用密码学 (practicalcryptography.com)

3.简单替换密码加密时,每个明文都有自己对应的密文,而且不是简单的移位,是混乱的。这也使得其破解难度要高于凯撒密码

eg:

1234明文: abcdefghijklmnopqrstuvwxyz密钥: phqgiumeaylnofdxjkrcvstzwba对应p,b对应h

一般用词频分析破解:quipqiup - cryptoquip and cryptogram solver

4.仿射密码$$加密函数:E(x) = (ax+b) \mod m$$

$$其中,x是明文通过某种数字得到的编码$$

$$a,m满足gcd(a,m)=1$$

$$m是编码系统中字母的个数$$

$$eg:如果以26字母表作为编码系统,则m=26$$

$$解密函数:D(x)=a^{-1}(x-b)\mod m$$

$$a^{-1}是模m的逆元$$

二、多表代换1.Playfair原理:

选取一串英文字母,除去重复出现的字母,将剩下的字母逐个逐个加入 5 × 5 的矩阵内,剩下的空间由未加入的英文字母依 a-z 的顺序加入。注意,将 q 去除,或将 i 和 j 视作同一字。

将要加密的明文分成两个一组。若组内的字母相同,将 X(或 Q)加到该组的第一个字母后,重新分组。若剩下一个字,也加入 X 。

在每组中,找出两个字母在矩阵中的地方

若两个字母不同行也不同列,在矩阵中找出另外两个字母(第一个字母对应行优先),使这四个字母成为一个长方形的四个角。

若两个字母同行,取这两个字母右方的字母(若字母在最右方则取最左方的字母)

若两个字母同列,取这两个字母下方的字母(若字母在最下方则取最上方的字母)

新找到的两个字母就是原本的两个字母加密的结果。

exp:

以 playfair example 为密匙,得

12345P L A Y FI R E X MB C D G HK N O Q ST U V W Z

要加密的讯息为 Hide the gold in the tree stump

1HI DE TH EG OL DI NT HE TR EX ES TU MP

加密后密文:

1BM OD ZB XD NA BE KU DM UI XM MO UV IF

加解密网站:Playfair加密解密_普莱费尔加密解密-ME2在线工具 (metools.info)

2.PolybiusPolybius 密码又称为棋盘密码

密码表长这样

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

eg: HELLO加密后 23 15 31 31 34

另外有种变表:

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

应用这种密码表的加密方式叫ADFGX加密

eg:HELLO 加密后得到 DD XF AG AG DF

3.Vigenere维吉尼亚密码(Vigenere)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。

eg:

明文

S

t

a

r

A

l

l

i

a

n

c

e

密钥

P

o

l

a

r

i

s

P

o

l

a

r

123456789明文:come greatwall密钥:crypto先把密钥变成和明文同样长度明文:comegreatwall密钥:cryptocryptoc然后查表,cc作为横纵坐标得到e加密后的密文为:efkt zferrltzn

解密网站:

未知密钥:My Geocaching Profile.com - Vigenere Cipher Codebreaker

已知密钥:http://planetcalc.com/2468/

[GDOUCTF 2023]1z Classic12345678910import mathfrom secret import ss = s.lower()keyM = [?]l = len(keyM)assert(math.gcd(l,26)==1)for i in range(len(s)): print(chr((ord(s[i])*l-97+(keyM[i % l]))%26+97),end="")#..........

加密可以看错是类似于仿射密码:$y_i = lx_i + k_i\mod 26$

乘上$l^{-1}$得$y_il^{-1} = x_i + k_il^{-1} \mod 26$

这就是标准的维吉尼亚密码了,题目给出$l$和$26$的关系

解题思路是先爆破出$l$,再网站解密

最后l为11

明文为:

1flagwowyouareclassicmaster

4.NihilistNihilist 密码又称关键字密码:明文 + 关键字 = 密文。

首先利用密钥构造棋盘矩阵(类似 Polybius 密码),新建一个 5 × 5 矩阵,将字符不重复地依次填入矩阵 ,剩下部分按字母顺序填入 ,字母 i 和 j 等价

以关键字 helloworld 为例

关键字导出的密码表如下

1

2

3

4

5

1

h

e

l

o

w

2

r

d

a

b

c

3

f

g

i/j

k

m

4

n

p

q

s

t

5

u

v

x

y

z

将明文中的每个字母对应横纵坐标就是其密文,例如a加密后是23

5.Hill希尔密码(Hill)使用每个字母在字母表中的顺序作为其对应的数字,即 A=0,B=1,C=2 等等。然后将明文转化为 n 维向量,跟一个 n × n 的矩阵相乘,再将得出的结果模 26。注意用作加密的矩阵(即密匙)在mod26下必须是可逆的,否则就不可能解码。

只有矩阵的行列式和 26 互质,才是可逆的。

eg:

在线解密工具http://www.practicalcryptography.com/ciphers/hill-cipher/

6.Autokey Cipher自动密钥密码(Autokey Cipher)也是多表替换密码,与维吉尼亚密码密码类似,但使用不同的方法生成密钥。

自动密钥密码主要有两种,关键词自动密钥密码和原文自动密钥密码。

以关键词自动密钥为例

12明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG关键词:CULTURE

以用关键词开始,填充为与明文等长的密钥

12明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG关键词:CULTURE THE QUICK BROWN FOX JUMPS OVER THE

和Vigenere同样的码表

加密后的密文为:VBP JOZGD IVEQV HYY AIICX CSNL FWW ZVDP WVK

原文自动密钥密码,应该是密钥和明文一样进行加密

当未知关键词(也就是未知密钥的时候)可以用网站解密http://www.practicalcryptography.com/cryptanalysis/stochastic-searching/cryptanalysis-autokey-cipher/