📜  维吉尼亚密码(1)

📅  最后修改于: 2023-12-03 15:27:37.183000             🧑  作者: Mango

维吉尼亚密码介绍

维吉尼亚密码(Vigenère Cipher)是一种多表替换加密方式,是古典密码学中非常经典的一种加密算法。该算法在16世纪被法国外交家布吕斯·德维尼亚(Blaise de Vigenère)所发明,因此得名维吉尼亚密码。它通过对明文中的每个字母根据一组密钥字母进行加密,来生成密文。

维吉尼亚密码的特点是,同一明文中不同的字母可能会被加密成不同的字母,这和单表替换密码不同。同时,由于密钥是多个字母组成的,因此维吉尼亚密码解密难度较高,安全性较高。

维吉尼亚密码加解密原理

维吉尼亚密码加密的过程可以简述为:

  1. 准备明文和密钥。
  2. 将密钥重复填充到与明文相同长度。
  3. 将明文和密钥中每个字母对应的数值相加,并对26取模,得到一个数字。
  4. 使用对应数字的字母替换明文中的字母,生成密文。

例如,假设我们要对明文“HELLO”进行加密,密钥为“WORLD”。那么加密过程可以如下表格所示:

| 明文 | H | E | L | L | O | | ----------- | - | - | - | - | - | | 密钥 | W | O | R | L | D | | 加密后的数字 | 22 | 14 | 11 | 11 | 17 | | 密文 | W | O | L | L | R |

维吉尼亚密码解密的过程则是将密钥中的字母对应的数值从密文中的字母数值中减去,得到明文中的字母数值。

维吉尼亚密码实现

维吉尼亚密码可以使用Python等编程语言实现,以下是一个简单的Python代码片段,可以用于加密和解密:

def vigenere_cipher(text, key, encrypt=True):
    res = []
    for i, c in enumerate(text):
        k = key[i % len(key)]
        offset = ord(k) - ord('A') if k.isupper() else ord(k) - ord('a')
        if c.isupper():
            base = ord('A')
        elif c.islower():
            base = ord('a')
        else:
            res.append(c)
            continue
        if encrypt:
            code = (ord(c) - base + offset) % 26 + base
        else:
            code = (ord(c) - base - offset) % 26 + base
        res.append(chr(code))
    return ''.join(res)

该函数接受文本和密钥两个参数,encrypt参数表示是否加密。为了简化代码,这里假设输入的文本和密钥都只包含ASCII字母。如果需要支持其他字符集,可以进行一定的修改。