经典密码学和现代密码学的结构及其主要区别(1)维吉尼亚密码—附py代码
Vigenère cipher 维吉尼亚密码
维吉尼亚密码由布莱斯·德·维吉尼亚在 16 世纪发明,是凯撒密码的一个更复杂的扩展。它是一种多字母替换密码,使用一个关键字来确定明文中不同字母的多个移位值。
与凯撒密码不同,凯撒密码对所有字母都有固定的偏移量,而维吉尼亚密码使用一个重复的关键词为消息中的每个字母创建不同的偏移量。这使其更能抵御频率分析,但如果消息的一部分已知,它仍然容易受到已知明文攻击。维吉尼亚密码曾被认为相当安全,但用现代密码分析技术可以破解。
凯撒密码和维吉尼亚密码都是早期加密方法的历史实例。虽然它们易于理解,并在密码学史上发挥了重要作用,但它们缺乏现代加密应用所需的强大安全性,不适合保护敏感的数字信息。
维吉尼亚密码的主要特点
- 密钥。维吉尼亚密码使用一个关键字或短语作为加密和解密消息的密钥。关键字可以是任意长度,并通常重复以匹配明文的长度。
- 多字母表密码。与凯撒密码不同,凯撒密码对所有字符使用固定的移位值,维吉尼亚密码采用多字母表的方法。这意味着消息的不同部分可能会有不同的移位量,使其更复杂且更安全。
- 字母表。为了执行加密和解密,使用维吉尼亚表(也称为维吉尼亚方阵或正方形表)。该表由多个字母表的行和列组成,每行代表不同的凯撒密码移位。
• 加密过程
- 要加密一条消息,您需要将明文和关键词对齐。
- 对于明文中的每个字母,您都要在维吉尼亚密码表中找到由密钥中相应字母所确定的行。
- 然后找到与你想要加密的明文字母相对应的那一列。
- 行与列的交叉点即为密文字母。
- 对明文中的每个字母重复此过程。
• 解密过程
- 用维吉尼亚密码进行解密的过程与加密正好相反。
- 将密文与关键词对齐,就像加密时那样。
- 对于密文中的每个字母,根据关键字中的相应字母在维吉尼亚密码表中找到对应的行。
- 找到包含密文字母的那一列。
- 行与列的交叉点给出的就是明文字母。
- 对密文中的每个字母都重复此过程。
维吉尼亚密码比简单的凯撒密码更安全,因为它通过密钥引入了变化性。这使得频率分析和暴力破解攻击更具挑战性。但维吉尼亚密码的安全性仍然有限,尤其是在使用较短密钥时。较长的密钥能提高安全性。它容易受到卡西斯基检验的攻击,一种能够帮助识别密文中重复模式的技术,并有可能揭示有关密钥长度的信息。
🔹🔹🔹
假设有 m = 7 ,且关键字为 PHYSICS。对应于数值等价 K = (8, 0, 17, 11, 1, 21, 11)。
C i = ( M i + K i m o d m ) m o d 26 C_i = (M_i + K_{i \mod m}) \mod 26 Ci=(Mi+Kimodm)mod26 其中 M i M_i Mi为明文字母数值(A=0), K j K_j Kj为密钥字母数值, m m m为密钥长度。
- m m m:密钥长度(此处 m = 7 )
- M i M_i Mi:明文中第 i 个字符的数值( a=0, b=1,…, z=25 )
- K j K_j Kj:密钥中第j个字符的数值( j = i mod m )
- C i C_i Ci:密文中第i个字符的数值
密文结果为:uaitvntclzlohtpazwfnncpyjtdnabfzl
解密时将使用相同的关键字,但要从密文中减去它,而不是加上它。
例如:
明文 m
(索引: i = 0 ):
C i C_i Ci = (12 + 8) mod 26 = 20
密文是: u
py代码示例(仅供参考):
plaintext = "mariusiulianmihailescuphysicsbook"
key = [8, 0, 17, 11, 1, 21, 11]
ciphertext = []for i, char in enumerate(plaintext):# 将明文字符转换为0-25的数值p = ord(char) - ord('a')# 获取对应的密钥k = key[i % 7]# 加密并转换回字符encrypted_char = chr((p + k) % 26 + ord('a'))ciphertext.append(encrypted_char)# 将密文字符列表转换为字符串
ciphertext_str = ''.join(ciphertext)
print(ciphertext_str)
运行结果: