通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

python如何实现vigenere加密

python如何实现vigenere加密

Python实现Vigenere加密的方法有多种,其中包括:构建字母表、实现加密和解密函数、处理明文和密钥的长度差异。 具体来说,构建字母表是为了方便字母的索引和映射,加密函数将明文字母与密钥字母进行按字母表的位移操作,解密函数则反向操作。以下我将详细展开Vigenere加密的实现方法,并提供示例代码。

一、构建字母表

字母表是Vigenere加密的基础,通过字母表可以实现字母的位移。通常使用英文字母(26个字符)进行加密。

import string

alphabet = string.ascii_uppercase

二、实现加密函数

加密函数的主要步骤包括:

  1. 将明文和密钥转换为大写字母。
  2. 处理明文和密钥的长度差异,使密钥循环使用。
  3. 将明文字母按密钥字母的位移进行加密。

def vigenere_encrypt(plaintext, key):

alphabet = string.ascii_uppercase

plaintext = plaintext.upper()

key = key.upper()

encrypted_text = []

key_length = len(key)

key_as_int = [alphabet.index(i) for i in key]

plaintext_as_int = [alphabet.index(i) for i in plaintext]

for i in range(len(plaintext_as_int)):

value = (plaintext_as_int[i] + key_as_int[i % key_length]) % 26

encrypted_text.append(alphabet[value])

return ''.join(encrypted_text)

三、实现解密函数

解密函数的主要步骤包括:

  1. 将密文和密钥转换为大写字母。
  2. 处理密文和密钥的长度差异,使密钥循环使用。
  3. 将密文字母按密钥字母的位移进行解密。

def vigenere_decrypt(ciphertext, key):

alphabet = string.ascii_uppercase

ciphertext = ciphertext.upper()

key = key.upper()

decrypted_text = []

key_length = len(key)

key_as_int = [alphabet.index(i) for i in key]

ciphertext_as_int = [alphabet.index(i) for i in ciphertext]

for i in range(len(ciphertext_as_int)):

value = (ciphertext_as_int[i] - key_as_int[i % key_length]) % 26

decrypted_text.append(alphabet[value])

return ''.join(decrypted_text)

四、处理明文和密钥的长度差异

在Vigenere加密中,密钥通常比明文短,因此需要循环使用密钥。我们可以通过取模操作来实现这一点,即使用 i % key_length 来循环使用密钥字母。

五、示例代码

为了更好地理解上述加密和解密函数,下面是一个完整的示例代码,包括输入明文和密钥,以及加密和解密的过程。

import string

def vigenere_encrypt(plaintext, key):

alphabet = string.ascii_uppercase

plaintext = plaintext.upper()

key = key.upper()

encrypted_text = []

key_length = len(key)

key_as_int = [alphabet.index(i) for i in key]

plaintext_as_int = [alphabet.index(i) for i in plaintext]

for i in range(len(plaintext_as_int)):

value = (plaintext_as_int[i] + key_as_int[i % key_length]) % 26

encrypted_text.append(alphabet[value])

return ''.join(encrypted_text)

def vigenere_decrypt(ciphertext, key):

alphabet = string.ascii_uppercase

ciphertext = ciphertext.upper()

key = key.upper()

decrypted_text = []

key_length = len(key)

key_as_int = [alphabet.index(i) for i in key]

ciphertext_as_int = [alphabet.index(i) for i in ciphertext]

for i in range(len(ciphertext_as_int)):

value = (ciphertext_as_int[i] - key_as_int[i % key_length]) % 26

decrypted_text.append(alphabet[value])

return ''.join(decrypted_text)

if __name__ == "__main__":

plaintext = "HELLO WORLD"

key = "KEY"

encrypted_text = vigenere_encrypt(plaintext, key)

print(f"Encrypted Text: {encrypted_text}")

decrypted_text = vigenere_decrypt(encrypted_text, key)

print(f"Decrypted Text: {decrypted_text}")

六、进阶实现

在实际应用中,我们可能需要处理更多字符(如空格、标点符号等),并且希望保持这些字符不变。以下是一个更复杂的实现版本,处理了非字母字符。

def vigenere_encrypt_advanced(plaintext, key):

alphabet = string.ascii_uppercase

encrypted_text = []

key_length = len(key)

key_as_int = [alphabet.index(i) for i in key.upper()]

key_index = 0

for char in plaintext:

if char.upper() in alphabet:

plain_index = alphabet.index(char.upper())

key_value = key_as_int[key_index % key_length]

value = (plain_index + key_value) % 26

encrypted_char = alphabet[value]

if char.islower():

encrypted_char = encrypted_char.lower()

encrypted_text.append(encrypted_char)

key_index += 1

else:

encrypted_text.append(char)

return ''.join(encrypted_text)

def vigenere_decrypt_advanced(ciphertext, key):

alphabet = string.ascii_uppercase

decrypted_text = []

key_length = len(key)

key_as_int = [alphabet.index(i) for i in key.upper()]

key_index = 0

for char in ciphertext:

if char.upper() in alphabet:

cipher_index = alphabet.index(char.upper())

key_value = key_as_int[key_index % key_length]

value = (cipher_index - key_value) % 26

decrypted_char = alphabet[value]

if char.islower():

decrypted_char = decrypted_char.lower()

decrypted_text.append(decrypted_char)

key_index += 1

else:

decrypted_text.append(char)

return ''.join(decrypted_text)

if __name__ == "__main__":

plaintext = "Hello, World!"

key = "KEY"

encrypted_text = vigenere_encrypt_advanced(plaintext, key)

print(f"Encrypted Text: {encrypted_text}")

decrypted_text = vigenere_decrypt_advanced(encrypted_text, key)

print(f"Decrypted Text: {decrypted_text}")

七、结论

Vigenere加密是一种经典的加密方法,通过字母表的位移实现加密和解密。本文详细介绍了构建字母表、实现加密和解密函数以及处理明文和密钥长度差异的方法。通过上述示例代码,我们可以清晰地看到Vigenere加密的实现过程。在实际应用中,我们也可以根据需要进行更多的处理,如保持非字母字符不变等。希望本文能对你理解和实现Vigenere加密有所帮助。

相关问答FAQs:

如何使用Python实现Vigenère加密算法?
Vigenère加密算法可以通过字符串处理和ASCII码运算来实现。你可以创建一个简单的Python函数,通过对每个字母进行偏移来加密文本。以下是一个基本的实现示例:

def vigenere_encrypt(plaintext, key):
    encrypted_text = ""
    key_length = len(key)
    key_index = 0
    
    for char in plaintext:
        if char.isalpha():  # 只对字母进行加密
            shift = ord(key[key_index % key_length].lower()) - ord('a')
            if char.islower():
                encrypted_text += chr((ord(char) - ord('a') + shift) % 26 + ord('a'))
            else:
                encrypted_text += chr((ord(char) - ord('A') + shift) % 26 + ord('A'))
            key_index += 1  # 只有字母才增加key_index
        else:
            encrypted_text += char  # 非字母字符保持不变
            
    return encrypted_text

Vigenère加密的密钥选择有什么注意事项?
选择一个强大的密钥是确保Vigenère加密有效性的关键。建议使用足够长且复杂的密钥,避免使用常见的单词或短语。使用随机生成的字符组合可以增加加密的安全性。此外,确保密钥的长度与明文相近,有助于提高加密的强度。

如何解密Vigenère加密的文本?
解密过程与加密过程相似,只需反向操作。你可以创建一个解密函数,使用相同的密钥并进行相反的字符偏移。以下是一个解密的示例代码:

def vigenere_decrypt(ciphertext, key):
    decrypted_text = ""
    key_length = len(key)
    key_index = 0
    
    for char in ciphertext:
        if char.isalpha():  # 只对字母进行解密
            shift = ord(key[key_index % key_length].lower()) - ord('a')
            if char.islower():
                decrypted_text += chr((ord(char) - ord('a') - shift + 26) % 26 + ord('a'))
            else:
                decrypted_text += chr((ord(char) - ord('A') - shift + 26) % 26 + ord('A'))
            key_index += 1  # 只有字母才增加key_index
        else:
            decrypted_text += char  # 非字母字符保持不变
            
    return decrypted_text

使用这些代码,你可以轻松地在Python中实现Vigenère加密和解密。

相关文章