用hill密码加密消息hill,密钥为,hill密码的加密解密详细过程

  用hill密码加密消息hill,密钥为,hill密码的加密解密详细过程

  希尔密码是一种使用矩阵加密的加密算法,其本质是多表置换密码。

  百科:

  希尔密码是一种利用基本矩阵理论原理的替代密码,由莱斯特s希尔于1929年发明。

  每个字符都被视为十六进制数。A=0,B=1,C=2…将一系列字符作为N维向量,乘以nn的矩阵,得到的结果作为模型26。

  请注意,用于加密的矩阵或加密密钥必须是可逆的,否则无法解密。只有矩阵的行列式和26互质是可逆的。由于希尔密码是用矩阵运算加密的,同样的明文加密可能会出现不同的密文,请参考字母频率攻击法

  010-59001被解密为加密密钥定义矩阵A:

  [ 1,2,1 ]

  [ 0,2,1 ]

  [ 1,0,2 ]

  2.将字母数字字符(1-a,2-B.)对应于要加密的明文字符;

  3.将转换后的明文数字串密钥矩阵的次数分组(3个字符作为这个);

  4.每组数字串与密钥矩阵矩阵相乘(13矩阵乘以33矩阵)的结果为加密:

  5.您可以将密文数字字符串转换为相应的字母。密文数字序列.

  3358www。Sina.com/解密过程与加密相同,唯一的区别是密文字符串

  形成矩阵时,密文组乘以逆矩阵的结果是解密:

  代码实现#!/usr/yxdwx/python 3.7 #-*-编码:UTF-8-* # @时间:2019/12/114336053 # @ author 3360 system defender输入矩阵,判断是否有行列式的顺序和行列式rank=list的第一行(在NIST)。split()matrix=[0]* len(rank)for I in range(1)len)rank=len(matrix):print 输入错误,重新输入。)continue #将字符类型转换为整数类型for iinrange(Len(Matrix)):Matrix(I)=list)map)lambdax:int)x),Matrix)))continue return Matrix #反向定义基础结构(Matrix):try:linalg . inv(Matrix)Except:returnfalse return true确定是否存在_ inverse=linalg . inv(Matrix)Except 3360 return-1 return Matrix))Except 3360消息组defcreate messagelist(messagematrix)):Matrix rank=Len)Matrix)# messagelist=[]#生成扩展消息序列

  或I in range(order( a ),order( z )1):字母列表。append(chr(I))for I in range(10):letterlist。append(str(I))#添加空格,解决分组填充问题字母列表。追加()#替换字母为数字对于消息列表中的消息:list tmp=[]for I in range(len(message)):list tmp。附加(字母列表。index(message[I]))messagedigitlist。append(list tmp)返回messagedigitlist #数字序列转化为字母数字指示器(消息列表):消息列表=[] #还原后的字母列表letterList=[]for I in range(ord( a ),ord( z )1):letterList。append(chr(I))for I in range(10):letterList。append(str(I))字母列表。追加()#替换数字为字母对于消息列表中的消息:messageletterlist。追加(信件列表[消息% 37])返回消息名单#加密def encrypt(message,matrix): ciphertextList=[] #加密结果列表按摩列表=创建按摩列表(按摩,matrix)messagedigitlist=letterToDigit(message list)#矩阵相乘对于messagedigitlist中的message digit:for I in range(len(message digit)):sum=0 for j in range(len(message digit)):sum=message digit[j]* matrix[j][I % len(matrix)]密文列表。追加(总和% 37)返回密码文本列表#解密def decrypt(message,matrix): plaintextList=[] #解密结果列表matrix _ inverse=createMatrixInverse(matrix)消息列表=创建消息列表(message,矩阵)#矩阵相乘for message list:for I in range(len(msg)):sum=0 for j in range(len(msg)):sum=msg[j]* matrix _ inverse[j][I % len(matrix)]纯文本列表。追加(sum % 37)#浮点型转换为整型(采用四舍五入—— round())纯文本列表=list(map(lambda x:int(round(x)),纯文本列表))纯文本列表=digit toletter(纯文本列表)#数字转换为字母plaintext= 对于纯文本列表中的项:plaintext=item如果_ _ name _ _= _ _ main _ _ :而True:print( —————希尔密码—————)选择=输入( 1,加密2、解密\n请选择:)if choice==1: print(输入矩阵:)矩阵=输入矩阵()消息=输入(输入msg:)message list=create message list(message,matrix)密文list=encrypt(message,matrix) print(加密结果:,cipher textlist)elif choice== 2 :messaging list=list(map(int,list(input(输入密文序列:).拆分(,))))打印(输入矩阵:)matrix=input matrix()matrix _ inverse=createMatrixInverse(matrix)print(逆矩阵:)for item in matrix _ inverse:print(item)plaintext=decrypt(message list,matrix) print(解密结果:,明文)其中,求逆矩阵部分未能手算,调用了数组库中的软件包简介函数,惭愧………………

  加密测试—————希尔密码—————1、加密2、解密请选择:1输入矩阵:1 0 1 10 1 0 11 1 0 01 1 0 1输入消息:系统防御者加密结果: [18, 24, 18, 24, 11, 19, 4, 20, 36, 35, 5, 27, 2, 15, 4, 20]—————希尔密码—————1、加密2、解密请选择:2输入密文序列:18, 24, 18, 24, 11, 19, 4, 20, 36, 35, 5, 27, 2, 15, 4, 20输入矩阵:1 0 1 10 1 0 11 1 0 01 1 0 1逆矩阵:[ 0.-1.0.1.][ 0.1.1.-1.][ 1.1.1.-2.][ 0.0.-1.1.]解密结果:系统防御者需先求出加密密钥的逆矩阵

  加密:

  部分代码详解解密:代码片段:

  While True: #输入一行,rank=list (input( )。split())matrix=[[0]* len(rank)for I in range(len(rank))]matrix[0]=rank # Enter行列式残差数据for I in range (1,len(matrix)):matrix[I]=list(input( )。split ()) #判断每一行输入是否合法if len(matrix[i])!=len(matrix): print(输入错误,请重新输入。)continue片段在inputMatrix()函数中。

  在输入矩阵部分,不允许用户先定义顺序,但是这个狂喜矩阵的顺序是由用户输入的矩阵的第一行决定的,连续进行合法判断。

  输入矩阵部分代码片段:

  #浮点转换为整数(四舍五入—— round())明文列表=list (map (lambda x: int (round (x)))明文列表=digittolet(明文列表)#数字转换为字母该片段位于decrypt(message,matrix)函数中。

  因为逆矩阵中有不可约或可除的小数,这里用四舍五入(x)的方法来松散地解决这个问题。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: