在Python中的希尔密码

在Python中的希尔密码

介绍

密码学是编写用于保护两方之间通信的代码或密码的艺术。其中一种最流行的密码就是 希尔密码 ,它是一种 多图形替代密码 。与一种 单字母 密码不同,希尔密码使用矩阵来加密和解密消息。在本文中,我们将讨论希尔密码以及如何在Python中实现它。

希尔密码

希尔密码由 Lester S. Hill1929年 发明,以他的名字命名。它是一种使用矩阵来进行 加密解密 的替代密码。希尔密码是一种 多图形 密码,意味着它对一组字母而不是单个字母进行操作。它的工作原理是将明文消息分成固定大小的块,通常是 2个或3个字母 ,并将每个块转换为 数值矩阵 。然后,将矩阵与 密钥矩阵 相乘,得到 加密消息 ,也是一个矩阵。然后将加密消息转换回字母,以生成密文。

希尔密码基于线性代数和模算术。为了使用希尔密码,发送者和接收者必须就一个 密钥矩阵 达成一致。密钥矩阵必须是 可逆的 ,即它具有矩阵逆。矩阵的逆是这样一个矩阵,当与 原始矩阵 相乘时,产生 单位矩阵 。单位矩阵是一个对角线上为1,其他位置为0的矩阵。可以使用矩阵代数计算矩阵的逆。

加密

使用希尔密码 加密 消息时,发送者将消息分为固定大小的块,通常是 2个或3个字母 。然后,使用替代方案将每个块转换为数值矩阵。例如, A=0,B=1,C=2 ,以此类推。然后,发送者将矩阵乘以密钥矩阵,以生成加密消息,也是一个矩阵。然后使用相同的替代方案将加密消息转换回字母。例如, 0=A,1=B,2=C ,以此类推。

以下是使用2×2密钥矩阵加密消息 “HELLO” 的示例:

Message:  HELLO
Matrix:   [7 4]  [11 7]
          [11 14] [3 8]

Encrypted message: DRBGC

解密

使用Hill密码解密消息时,接收方将密文消息转换为矩阵,使用与发送方相同的替代方案。然后,接收方将该矩阵乘以密钥矩阵的逆矩阵,以生成解密后的消息,这也是一个矩阵。然后,解密后的消息再次使用相同的替代方案转换为字母。

以下是使用相同的2×2密钥矩阵解密消息“DRBGC”的示例:

Encrypted message: DRBGC
Matrix:           [3 17]
                  [1 2]

Key matrix:       [7 4]
                  [11 7]

Inverse key matrix: [7 -4]
                    [-11 7]

Decrypted message: HELLO

在Python中的实现

既然我们了解了Hill密码,让我们在Python中实现它。我们将使用NumPy库进行矩阵运算。

import numpy as np

# Substitution dictionary for mapping letters to numbers
substitution = {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9,
               'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18,
               'T': 19, 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24, 'Z': 25}

# Inverse substitution dictionary for mapping numbers to letters
inverse_substitution = {value: key for key, value in substitution.items()}

def encrypt(plain_text, key_matrix):
    # Convert the plain text to uppercase
plain_text = plain_text.upper()

    # Remove any spaces from the plain text
plain_text = plain_text.replace(" ", "")

    # Pad the plain text if its length is not a multiple of the key matrix size
    if len(plain_text) % len(key_matrix) != 0:
padding_length = len(key_matrix) - (len(plain_text) % len(key_matrix))
plain_text += 'X' * padding_length

    # Initialize the cipher text
cipher_text = ''

    # Encrypt the plain text
    for i in range(0, len(plain_text), len(key_matrix)):
        # Get the current block of the plain text
        block = plain_text[i:i+len(key_matrix)]

        # Convert the block to a column vector of numbers
block_vector = np.array([substitution[ch] for ch in block])

        # Multiply the key matrix with the block vector
encrypted_vector = np.dot(key_matrix, block_vector) % 26

        # Convert the encrypted vector back to a string
encrypted_block = ''.join([inverse_substitution[num] for num in encrypted_vector])

        # Append the encrypted block to the cipher text
cipher_text += encrypted_block

    return cipher_text

# Example usage
plain_text = 'HELLO WORLD'
key_matrix = np.array([[6, 24], [1, 13]])

cipher_text = encrypt(plain_text, key_matrix)
print("Cipher Text:", cipher_text)

输出:

Cipher Text: TUCWYJIXXNV

解释:

在这个程序中, encrypt函数 接受明文和密钥矩阵作为输入,并使用 Hill密码 算法进行加密。该函数首先将明文转换为 大写字母 并删除任何 空格 。然后,如果明文的长度不是密钥矩阵大小的倍数,函数会通过追加 ‘X’ 字符来填充明文。

加密的过程是将明文分成密钥矩阵大小的块。每个块根据替换字典转换为列向量。然后,使用 NumPy的点积 将密钥矩阵与块向量相乘。得到的加密向量对26取模,以确保值保持在 字母 范围内。最后,使用逆替换字典将 加密向量 转换回字符串。

在示例用法中,明文 “HELLO WORLD” 使用 2×2的密钥矩阵 进行加密。然后将得到的密文输出到控制台。

此输出表示使用给定的密钥矩阵,对输入明文 “HELLO WORLD” 使用Hill密码进行加密的结果。

结论

总之, Hill密码 是一种经典的加密算法,可用于安全传输消息。它基于矩阵乘法,并使用密钥矩阵加密和解密消息。Hill密码是一个相对简单的算法,但在使用大型密钥矩阵时提供了高级别的安全性。在本文中,我们使用 NumPy库 在Python中实现了Hill密码算法。该实现可以加密和解密任意长度的消息,并可以使用任意大小的密钥矩阵。值得注意的是,Hill密码的安全性取决于所使用密钥的安全性,如果密钥选择不慎,它可能容易受到攻击。因此,在使用Hill密码进行加密时,使用安全的密钥生成方法非常重要。总的来说,Hill密码是一种强大的加密算法,可用于在各种应用中保护敏感信息。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程