希尔密码(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)相关推荐

  1. C++希尔密码Hill Cipher算法(附完整源码)

    希尔密码Hill Cipher的算法 希尔密码(Hill Cipher) 的算法的完整源码(定义,实现,main函数测试) 希尔密码(Hill Cipher) 的算法的完整源码(定义,实现,main函 ...

  2. Visual Studio 2019下用 C# 实现 Hill2 二阶希尔密码 的加密、解密 GUI界面

    1.什么是Hill2 什么是Hill密码 希尔密码(Hill)使用每个字母在字母表中的顺序作为其对应的数字,即 A=0,B=1,C=2 等,然后将明文转化为 n 维向量,跟一个 n × n 的矩阵相乘 ...

  3. C++希尔密码的实现以及运用

    希尔密码(Hill Cipher)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明.每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一 ...

  4. 希尔密码在CTF中应用—记一道题

    CTF-crypto 解题思路来自:i春秋的大佬们 https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=52687&highli ...

  5. JavaScript实现希尔密码 算法(附完 整源码)

    JavaScript实现希尔密码 算法 Matrix.js完整源代码 hillCipher.js完整源代码 hillCipher.test.js完整源代码 Matrix.js完整源代码 export ...

  6. Hill Cipher 希尔密码 已知明文密文 求秘钥方法

    Hill Cipher,已知明文密文,求秘钥 设K为秘钥, 为明文字母对应的数字矩阵, 为密文字母对应的数字矩阵. 是希尔加密的过程. 为了求解K,我们需要求解P的膜26逆元. 注意,这里是膜26逆元 ...

  7. 希尔密码(hill)的解密与加密

    hill的理论 hill密码涉及到了一部分线性代数方面的求解,在做题时要注意求解逆序数. 加密:Bi = A * ai(mod 26) 解密:ai = A^-1 * Bi 这里的 A 为加密密钥,ai ...

  8. 明文攻击之猪圈密码、希尔密码..

    猪圈密码是一种以格子为基础的简单替代式密码.即使使用符号,也不会影响密码分析,亦可用在其它替代式的方法.右边的例子,是把字母填进格子的模样. The core elements of this sys ...

  9. 逆矩阵在希尔密码中的应用

    今天看到这样的一个密码问题.研究了一下简单写了如下代码,由于不太了解求逆矩阵的方法,所以A矩阵的逆矩阵直接给定了.如果有知道求逆矩阵方法的大神方便的话请给指点一下. #include <bits ...

  10. CTF中Crypty入门必看(密码类,密码学)

    常见编码 ASCII编码 ASCII码大致可以分为三部分组成: 第一部分是:ASCII非打印控制字符 第二部分是:ASCII打印字符: 第三部分是:扩展ASCII打印字符. 在线ASCII码与进制互相 ...

最新文章

  1. PHP函数处理方法总结
  2. 重庆两江新区将建国内最大“云计算”数据基地
  3. centos mysql.tar.gz_centos7.2 mysql tar.gz 搭建 (亲测成功)
  4. 生产线改造升级 蔚来部分10月份车辆订单将推迟交付
  5. 不买iPhone11的四大理由,最后一个扎心了
  6. Maven Ant 中截取字符串
  7. 供应链 信用管理 大数据_大数据分析在供应链管理中的应用
  8. 解决: Android.bp ninja: error: unknown target MODULES-IN-xxx报错
  9. 蓝桥杯2021年第十二届C++省赛第七题-砝码称重
  10. Oracle开发:常用的数据库字段类型[转]
  11. css hack 笔记 for ie8,ie7
  12. SSH密匙key介绍
  13. Android_GitHub_xUtils之DbUtils、ViewUtils、HttpUtils、BitmapUtils
  14. 尝试手写一个框架(二)手写一个MVC的框架
  15. zhang 快速并行细化方法_Zhang快速并行细化算法.docx
  16. mme 服务器位置,MME、PGW、SGW和PCRF的介绍
  17. 程序猿的移民加拿大后的所感
  18. Java狐仙ol,狐仙八大职业介绍 简要分为四类
  19. 操作系统对计算机组件的抽象概念表示
  20. 原生js实现循环精灵图

热门文章

  1. linux 7zip 安装包,linux下安装7zip
  2. 自动控制原理学习笔记(五)
  3. 聊天系统服务器端类图,课程设计-简单聊天室JAVA课程设计.doc
  4. 研究人性弱点的黑客?聊聊社会工程学与网络安全
  5. duilib介绍-1
  6. ios备忘录下载安卓版_ios8备忘录app软件下载
  7. 魅族发布两款新品:魅蓝 X 1699元起
  8. 非线性光纤光学_《Nature》子刊:解决大纵横比光纤中传质不匀的难题!
  9. CUDA: (十一) NVIDIA 2D Image And Signal Performance Primitives (NPP) 初探
  10. 2020,ToB 生态全景解读