python Hill密码

本文介绍如何使用Python编写Hill密码的加密程序,包括生成密钥矩阵和求逆矩阵的步骤,以实现字符串的加密与解密操作。
摘要由CSDN通过智能技术生成

以下python代码用于生成Hill密码的密钥矩阵及其逆矩阵

#@PydevCodeAnalysisIgnore
"""
input : N
output : a pair of matrix which is inverse matrix of another.
"""

import random
import copy
import fractions

def relative_prime_lst(N):
    '''
    list all relatively prime in range(1,N) with N
    @param N: integer
    '''
    return [m for m in range(1, N) if fractions.gcd(m,N)==1]

def ext_euclid(a,b):
    '''
    get the result of a*s+b*t = gcd(a,b)
    return (s,t,gcd)
    @param a: integer >0
    @param b: integer >0
    '''
    r1 = a
    r2 = b
    s1 = 1
    s2 = 0
    t1 = 0
    t2 = 1
    while r2>0:
        q = r1/r2
        r = r1-r2*q
        r1 = r2
        r2 = r
        
        s = s1-q*s2
        s1 = s2
        s2 = s
        
        t = t1-q*t2
        t1 = t2
        t2 &
Hill密码是一种基于线性代数的密码算法,可以用矩阵加密和解密。以下是Hill密码Python实现: 加密: ```python import numpy as np # 明文转化为数字 def char2num(char): return ord(char.lower()) - 97 # 数字转化为明文 def num2char(num): return chr(num + 97) # 将明文转化为矩阵 def plaintext2matrix(plaintext, n): plaintext = plaintext.lower().replace(' ', '') plaintext_len = len(plaintext) matrix_len = (plaintext_len // n + (plaintext_len % n != 0)) * n matrix = np.zeros((matrix_len,), dtype=int) matrix[:plaintext_len] = [char2num(char) for char in plaintext] return matrix.reshape(-1, n) # 将矩阵转化为密文 def matrix2ciphertext(matrix, key): return np.dot(matrix, key) % 26 # Hill加密 def hill_encrypt(plaintext, key): n = key.shape[0] matrix = plaintext2matrix(plaintext, n) ciphertext_matrix = matrix2ciphertext(matrix, key) ciphertext = ''.join([num2char(num) for num in ciphertext_matrix.flatten()]) return ciphertext ``` 解密: ```python # 求解矩阵的逆 def matrix_inverse(matrix): det = np.linalg.det(matrix) inv_det = pow(int(det), -1, 26) adj_matrix = np.array([[pow(-1, i+j)*np.linalg.det(np.delete(np.delete(matrix, i, axis=0), j, axis=1)) for j in range(matrix.shape[1])] for i in range(matrix.shape[0])], dtype=int) inv_matrix = (inv_det * adj_matrix) % 26 return inv_matrix # 将密文转化为矩阵 def ciphertext2matrix(ciphertext, n): ciphertext_len = len(ciphertext) matrix_len = (ciphertext_len // n + (ciphertext_len % n != 0)) * n matrix = np.zeros((matrix_len,), dtype=int) matrix[:ciphertext_len] = [char2num(char) for char in ciphertext] return matrix.reshape(-1, n) # 将矩阵转化为明文 def matrix2plaintext(matrix): return ''.join([num2char(num) for num in matrix.flatten()]) # Hill解密 def hill_decrypt(ciphertext, key): n = key.shape[0] inv_key = matrix_inverse(key) ciphertext_matrix = ciphertext2matrix(ciphertext, n) plaintext_matrix = matrix2ciphertext(ciphertext_matrix, inv_key) plaintext = matrix2plaintext(plaintext_matrix) return plaintext ``` 使用示例: ```python # 加密 plaintext = 'hello world' key = np.array([[3, 2], [1, 4]]) ciphertext = hill_encrypt(plaintext, key) print(ciphertext) # 解密 plaintext = hill_decrypt(ciphertext, key) print(plaintext) ``` 输出: ``` fjqzvbtwvv helloworld ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值