hill加解密的原理实际上就是利用可逆矩阵,将明文矩阵和加密矩阵进行计算得到密文,在接收端利用密文和加密矩阵的逆进行计算再得到明文。[加密矩阵][明文矩阵]%256=[密文矩阵],[加密矩阵的逆][密文矩阵]%256=[明文矩阵]。
本次实验是将一串明文英文字符串(可包含空格)作为输入,根据加密矩阵的阶数来构建对应的明文矩阵(明文转换为ascii码),然后与加密矩阵进行计算,对256取余再对密文进行转义输出成加密字符。解密时,先计算加密矩阵的逆,调用python的numpy包进行计算,结果输出都是小数,需要转换为分数,得到分子和分母,目的是为了方便计算小数对整数取余。
小数对整数取余,先转换为分数。在python里面调用fractions,v = fractions.Fraction(mat[j][i]).limit_denominator()#小数转分数,v.denominator和v.numerato#分别获取分子和分母。
假设(a/b)%256取余:(a/b)%256=x得到a(%256)=bx,继续得到bx=256k+a,即x=(256k+a)/b。把k从0开始取,直到x计算得到整数为之。35/3对256取余得到97。
实验输入和输出为:
请输入加密位数(-1结束):9
请输入明文:wo ai ni zhongguo!
明文矩阵:
[[119, 97, 110, 122, 110, 117], [111, 105, 105, 104, 103, 111], [32, 32, 32, 111, 103, 33]]
加密矩阵
[[3, 0, 0], [0, 3, 0], [0, 0, 3]]
密文矩阵
[[101 35 74 110 74 95]
[77 59 59 56 53 77]
[96 96 96 77 53 99]]
加密密文为: eM`#;`J;`n8MJ55_Mc
解密矩阵
[[1/3 0 0]
[0 1/3 0]
[0 0 1/3]]
解密密文得: wo ai ni zhongguo!
至此,加解密完成。