希尔密码(Hill)
希尔密码(Hill)
加密对象: 小写字母
加密原理:
该加密方式使用了矩阵的相关知识,包括矩阵的逆,矩阵相乘。
a~z对应于1~26, 将明文转为数字。同理,在解密是也需要转为数字
a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 密文 = 秘钥矩阵*明文矩阵 (mod 26)
明文 = 秘钥矩阵的逆矩阵*密文矩阵 (mod 26)
秘钥矩阵是一个方阵,nxn阶。该矩阵的行列式必须与26互质
明文矩阵构建是依据秘钥矩阵的阶数来的,由于加密时需要相乘,故秘钥矩阵的行数(n)要等于明文矩阵的列数,不足的补0。密文矩阵同理。注意: 矩阵的构建是将明文分为多个列矩阵(我看大多数文档都是这样的),如对应于(1, 2, 3, 4),如果构成二维的话,就应该是[[1,3],[2,4]],而不是[[1,2],[3,4]]…
得到密文的数值后在查表转为字符就是密文了。其实加密过程和解密过程是一样的,只是一个乘的是秘钥矩阵,一个乘的是秘钥矩阵的逆矩阵。
代码
# write by 2021/7/6 # 希尔密码from math import sqrt import numpy as np from scipy import linalgDIC = "abcdefghijklmnopqrstuvwxyz"# 使用列表创建空矩阵, 用0填充 def create_matrix(n, m):matrix = []for i in range(n):matrix.append([])for j in range(m):matrix[i].append(0)# print(matrix)return matrix# 输入矩阵 def input_matrix(matrix):n, m = len(matrix), len(matrix[0])for i in range(n):for j in range(m):matrix[i][j] = int(input(f"输入{i}行{j}列数据: "))return matrix# 矩阵相乘 def matrix_multiply(matrix_a, matrix_b):a_n, a_m = len(matrix_a), len(matrix_a[0])b_n, b_m = len(matrix_b), len(matrix_b[0])if a_m != b_n:return -1matrix_c = create_matrix(a_n, b_m)num = 0for i in range(a_n):for j in range(b_m):num = 0for k in range(a_m):num += matrix_a[i][k]*matrix_b[k][j]matrix_c[i][j] = numreturn matrix_c# 辗转相除法 def gcd(a, b):a, b = b, a % b# print(a, b)if b == 0:return aelse:return gcd(a, b)# 判断秘钥的行列式是否与26互质, 以及秘钥是否可逆 def judge_key(key):a = np.array(key)det = int(np.linalg.det(a))if det == 0:return 0if 26 > det:max_gcd = gcd(26, det)else:max_gcd = gcd(det, 26)# print(f"26,{det}最大公约数: ", max_gcd)if max_gcd == -1 or max_gcd == 1:return 1return 0def encrypt_hill(string, key):# 判断秘钥的行列式是否与26互质, 以及秘钥是否可逆if not judge_key(key):return -1ciphertext = ""n = len(key)str_len = len(string)plaintext_lis = []ciphertext_lis = []# 转为数字for i in string.lower():if DIC.find(i) != -1:plaintext_lis.append(DIC.index(i)+1)else:return -1# 补"0"if str_len % n != 0:for i in range(n-len(plaintext_lis) % n):plaintext_lis.append(0)m = len(plaintext_lis)//n # m 为新矩阵的列数# 转为列表形式矩阵plaintext_matrix = create_matrix(n, m)for i in range(m):for j in range(n):plaintext_matrix[j][i] = plaintext_lis[i*n+j]# print("原位置=", plaintext_matrix)matrix_key = np.matrix(np.array(key))matrix_plaintext = np.matrix(np.array(plaintext_matrix))matrix_c = matrix_key*matrix_plaintextciphertext_lis = matrix_c.tolist()# print("加密后的位置=", ciphertext_lis)for i in range(m):for j in range(n):ciphertext += DIC[ciphertext_lis[j][i] % 26-1]# print("ciphertext=", ciphertext)return ciphertextdef decrypt_hill(string, key):# 判断矩阵行列式是否与26互质, 以及秘钥是否可逆if not judge_key(key):return -1plaintext = ""n = len(key)m = len(string)//n# inv_key = np.matrix(np.array(key)).Iinv_key = linalg.inv(np.array(key))# print("原矩阵=", np.array(key))# print("逆矩阵=", inv_key)# print("乘积=", inv_key*np.array(key))ciphertext_matrix = create_matrix(n, m)# 注意:这里的矩阵是一列一列放置,并不是一行一行放置for i in range(m):for j in range(n):ciphertext_matrix[j][i] = DIC.index(string[i*n+j])+1# print("密文位置=", ciphertext_matrix)matrix_ciphertext = np.matrix(np.array(ciphertext_matrix))# print(f"{matrix_ciphertext}")matrix_c = inv_key*matrix_ciphertextciphertext_lis = matrix_c.tolist()# print("解密后位置=", ciphertext_lis)for i in range(m):for j in range(n):# if ciphertext_lis[i][j] % 26 != 0:# print(round(ciphertext_lis[j][i]) % 26)plaintext += DIC[round(ciphertext_lis[j][i]) % 26 - 1]return plaintextif __name__ == '__main__':key_ = [[1, 2], [0, 1]]# print(matrix_multiply(key_, inv_key))print(judge_key(key_))ciphertext_ = encrypt_hill("flagishillissoeapy", key_)# ciphertext_ = "dloguszijluswogany"plaintext_ = decrypt_hill(ciphertext_, key_)print(f"{plaintext_}: {ciphertext_}")
希尔密码(Hill)相关推荐
- C++希尔密码Hill Cipher算法(附完整源码)
希尔密码Hill Cipher的算法 希尔密码(Hill Cipher) 的算法的完整源码(定义,实现,main函数测试) 希尔密码(Hill Cipher) 的算法的完整源码(定义,实现,main函 ...
- Visual Studio 2019下用 C# 实现 Hill2 二阶希尔密码 的加密、解密 GUI界面
1.什么是Hill2 什么是Hill密码 希尔密码(Hill)使用每个字母在字母表中的顺序作为其对应的数字,即 A=0,B=1,C=2 等,然后将明文转化为 n 维向量,跟一个 n × n 的矩阵相乘 ...
- C++希尔密码的实现以及运用
希尔密码(Hill Cipher)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明.每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一 ...
- 希尔密码在CTF中应用—记一道题
CTF-crypto 解题思路来自:i春秋的大佬们 https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=52687&highli ...
- JavaScript实现希尔密码 算法(附完 整源码)
JavaScript实现希尔密码 算法 Matrix.js完整源代码 hillCipher.js完整源代码 hillCipher.test.js完整源代码 Matrix.js完整源代码 export ...
- Hill Cipher 希尔密码 已知明文密文 求秘钥方法
Hill Cipher,已知明文密文,求秘钥 设K为秘钥, 为明文字母对应的数字矩阵, 为密文字母对应的数字矩阵. 是希尔加密的过程. 为了求解K,我们需要求解P的膜26逆元. 注意,这里是膜26逆元 ...
- 希尔密码(hill)的解密与加密
hill的理论 hill密码涉及到了一部分线性代数方面的求解,在做题时要注意求解逆序数. 加密:Bi = A * ai(mod 26) 解密:ai = A^-1 * Bi 这里的 A 为加密密钥,ai ...
- 明文攻击之猪圈密码、希尔密码..
猪圈密码是一种以格子为基础的简单替代式密码.即使使用符号,也不会影响密码分析,亦可用在其它替代式的方法.右边的例子,是把字母填进格子的模样. The core elements of this sys ...
- 逆矩阵在希尔密码中的应用
今天看到这样的一个密码问题.研究了一下简单写了如下代码,由于不太了解求逆矩阵的方法,所以A矩阵的逆矩阵直接给定了.如果有知道求逆矩阵方法的大神方便的话请给指点一下. #include <bits ...
- CTF中Crypty入门必看(密码类,密码学)
常见编码 ASCII编码 ASCII码大致可以分为三部分组成: 第一部分是:ASCII非打印控制字符 第二部分是:ASCII打印字符: 第三部分是:扩展ASCII打印字符. 在线ASCII码与进制互相 ...
最新文章
- PHP函数处理方法总结
- 重庆两江新区将建国内最大“云计算”数据基地
- centos mysql.tar.gz_centos7.2 mysql tar.gz 搭建 (亲测成功)
- 生产线改造升级 蔚来部分10月份车辆订单将推迟交付
- 不买iPhone11的四大理由,最后一个扎心了
- Maven Ant 中截取字符串
- 供应链 信用管理 大数据_大数据分析在供应链管理中的应用
- 解决: Android.bp ninja: error: unknown target MODULES-IN-xxx报错
- 蓝桥杯2021年第十二届C++省赛第七题-砝码称重
- Oracle开发:常用的数据库字段类型[转]
- css hack 笔记 for ie8,ie7
- SSH密匙key介绍
- Android_GitHub_xUtils之DbUtils、ViewUtils、HttpUtils、BitmapUtils
- 尝试手写一个框架(二)手写一个MVC的框架
- zhang 快速并行细化方法_Zhang快速并行细化算法.docx
- mme 服务器位置,MME、PGW、SGW和PCRF的介绍
- 程序猿的移民加拿大后的所感
- Java狐仙ol,狐仙八大职业介绍 简要分为四类
- 操作系统对计算机组件的抽象概念表示
- 原生js实现循环精灵图
热门文章
- linux 7zip 安装包,linux下安装7zip
- 自动控制原理学习笔记(五)
- 聊天系统服务器端类图,课程设计-简单聊天室JAVA课程设计.doc
- 研究人性弱点的黑客?聊聊社会工程学与网络安全
- duilib介绍-1
- ios备忘录下载安卓版_ios8备忘录app软件下载
- 魅族发布两款新品:魅蓝 X 1699元起
- 非线性光纤光学_《Nature》子刊:解决大纵横比光纤中传质不匀的难题!
- CUDA: (十一) NVIDIA 2D Image And Signal Performance Primitives (NPP) 初探
- 2020,ToB 生态全景解读