Hill密码

import numpy as np
from sympy import Matrix
import string
import crypt

alphabet = string.ascii_uppercase

def convert2matrix(m, dimension):
    for index, i in enumerate(m):
        values = []
        if index % dimension == 0:
            for j in range(0, dimension):
                values.append([alphabet.index(m[index + j])])
            if index == 0:
                m_mat = np.matrix(values)
            else:
                m_mat = np.hstack((m_mat, values))

    return m_mat

if __name__ == '__main__':
    m = 'BABYSHILL'
    c = 'HXZTCXAPB'
    dimension = 3
    unknown_c = 'TCSHXZTCXAPBDKJVJDOHJEAE'


    c = convert2matrix(c, dimension)

    c = Matrix(c)
    c_inv = c.inv_mod(26)  # 模逆矩阵,直接调库了,不调库自己实现或者通过numpy的逆矩阵稍加修改可以
    c_inv = c_inv.tolist()
    m = convert2matrix(m, dimension)
    m = np.matrix(m)
    dec_key = m * c_inv
    dec_key %= 26
    print(dec_key)
    m1 = crypt.hill_crypt(unknown_c, dec_key, dimension) #这是自己实现的简单的hill加密函数,也可用在线网站加密
    print(m1)

你可能感兴趣的:(Hill密码)