NumPy逆矩阵实现简单的文本加密解密

思路如下:

  1. 把明文构建成-个矩阵A
  2. 加密: A * 秘钥矩阵 = 密文矩阵
  3. 密文矩阵 * 秘钥矩阵的逆 = 明文矩阵

代码如下

import numpy as np


def getMap(str,col=3):      #  生成明文矩阵
    if len(str)%col > 0:
        str+=(col-(len(str)%col))*" "

    new_str=list(map(lambda x:ord(x),str))
    return np.array(new_str).reshape(-1,col)


key_mat=None
def genKey(n=3):
    ret=np.random.randint(0,2,(3,3))
    while np.linalg.det(ret) == 0:   # 防止生成的行列式为0
        ret=np.random.randint(0, 2, (3, 3))
    return ret


def encrypt(str,n=3):  #加密
    clearText_mat=getMap(str,col=n)   #生成明文矩阵
    global key_mat
    key_mat=genKey(n)       # 生成秘钥矩阵
    cipherText_mat=np.dot(clearText_mat,key_mat).reshape(-1)   #把密文矩阵转成一维数组 方便存储
    cipherText="".join(list(map(lambda x:chr(x),cipherText_mat)))   # chrascii转成字符
    return cipherText

def decrypt(str,n=3): #解密
    global key_mat
    cipherText_mat = getMap(str,col=n)  # 生成明文矩阵
    keyText_mat=np.linalg.inv(key_mat)   # 密文矩阵求逆
    clearText_mat=np.dot(cipherText_mat,keyText_mat).reshape(-1)  #明文矩阵
    clearText="".join(list(map(lambda x:chr(x),clearText_mat.astype(int))))
    return clearText


ret=encrypt("my name is yann")
print(ret)

print(decrypt(ret))

发表评论

电子邮件地址不会被公开。 必填项已用*标注