返回顶部
首页 > 资讯 > 精选 >希尔密码(hill密码)
  • 564
分享到

希尔密码(hill密码)

2023-06-02 01:06:57 564人浏览 安东尼
摘要

  简述  希尔密码是利用矩阵进行加密的一种加密算法,其本质是一种多表代换密码。  百科:  希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。  每个字母当作26进制数字:A=0, B=1, C=2…

  简述

  希尔密码是利用矩阵进行加密的一种加密算法,其本质是一种多表代换密码。

  百科:

  希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。

  每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。

  注意用作加密的矩阵(即密匙)在 必须是可逆的,否则就不可能解码。只有矩阵的行列式和26互质,才是可逆的。

  希尔密码由于采用矩阵运算加密,因此在相同的明文加密时,可能会出现不同的密文,因此可以很好的抵御字母频率攻击法。

  加解密

  加密:

  1、定义一个矩阵a(须存在逆矩阵)作为加密密钥:

  [1,2,1]

  [0,2,1]

  [1,0,2]

  2、将需要加密的明文字母转换为其对应的字母表数字(1-a,2-b……);

  3、将转换后的明文数字序列按照密钥矩阵的阶数进行分组(如本次为3个字符一组);

  4、每组数字序列和密钥矩阵进行矩阵的乘法运算(1x3 矩阵乘以 3x3矩阵),结果即为密文数字序列;

  5、可将密文数字序列转换为其对应字母,即为密文字符串

  解密:

  解密流程与加密相同,唯一不同之处在于:需先求出加密密钥的逆矩阵

  在做矩阵相成时,用密文分组乘以逆矩阵,结果即为明文

  代码实现

  #!/usr/bin/python3.7

  # -*- coding: utf-8 -*-

  # @Time : 2019/12/11 14:53

  # @Author : SystemDefenser

  # @Email : mrwx1116@163.com

  # @Software: PyCharm

  from numpy import linalg

  # 输入矩阵并判断是否存在逆矩阵

  def inputMatrix():

  while True:

  # 输入一行、作为行列式的阶数和行列式的第一行

  rank = list(input("").split())

  matrix = [[0] * len(rank) for i in range(len(rank))]

  matrix[0] = rank

  # 输入行列式剩余数据

  for i in range(1, len(matrix)):

  matrix[i] = list(input("").split())

  # 判断每一行输入是否合法

  if len(matrix[i]) != len(matrix):

  print("输入有误,重新输入。")

  continue

  # 转换字符型为整型

  for i in range(len(matrix)):

  matrix[i] = list(map(lambda x: int(x), matrix[i]))

  # 判断是否存在逆矩阵

  if not judgeInverse(matrix):

  print("矩阵不存在逆矩阵,重新输入。")

  continue

  return matrix

  # 判断是否存在逆元

  def judgeInverse(matrix):

  try:

  linalg.inv(matrix)

  except:

  return False

  return True

  # 生成密钥(矩阵的逆矩阵)

  def createMatrixInverse(matrix):

  try:

  matrix_inverse = linalg.inv(matrix)

  except:

  return -1

  return matrix_inverse

  # 生成消息分组

  def createMassageList(massage, matrix):

  matrixRank = len(matrix)

  massageList = []

  # 扩充消息序列并创建分组

  while len(massage) % matrixRank != 0:

  massage += " "

  for i in range(1, len(massage) + 1, matrixRank):

  massageList.append(massage[i-1:i + matrixRank - 1])

  return massageList

  # 字母序列转化为数字

  def letterToDigit(massageList):

  massageDigitList = [] # 替换后的数字列表

  letterList = [] # 字母列表

  for i in range(ord("a"), ord("z") + 1):

  letterList.append(chr(i))

  for i in range(10):

  letterList.append(str(i))

  # 添加空格,解决分组填充问题

  letterList.append(" ")

  # 替换字母为数字

  for massage in massageList:

  listTmp = []

  for i in range(len(massage)):

  listTmp.append(letterList.index(massage[i]))

  massageDigitList.append(listTmp)

  return massageDigitList

  # 数字序列转化为字母

  def digitToLetter(massageList):

  massageLetterList = [] # 还原后的字母列表

  letterList = []

  for i in range(ord("a"), ord("z") + 1):

  letterList.append(chr(i))

  for i in range(10):

  letterList.append(str(i))

  letterList.append(" ")

  # 替换数字为字母

  for massage in massageList:

  massageLetterList.append(letterList[massage % 37])

  return massageLetterList

  # 加密

  def encrypt(massage, matrix):

  ciphertextList = [] # 加密结果列表

  massageList = createMassageList(massage, matrix)

  massageDigitList = letterToDigit(massageList)

  # 矩阵相乘

  for massageDigit in massageDigitList:

  for i in range(len(massageDigit)):

  sum = 0

  for j in range(len(massageDigit)):

  sum += massageDigit[j] * matrix[j][i % len(matrix)]

  ciphertextList.append(sum % 37)

  return ciphertextList

  # 解密

  def decrypt(massage, matrix):

  plaintextList = [] # 解密结果列表

  matrix_inverse = createMatrixInverse(matrix)

  massageList = createMassageList(massage, matrix)

  # 矩阵相乘

  for msg in massageList:

  for i in range(len(msg)):

  sum = 0

  for j in range(len(msg)):

  sum += msg[j] * matrix_inverse[j][i % len(matrix)]

  plaintextList.append(sum % 37)

  # 浮点型转换为整型(采用四舍五入——round())

  plaintextList = list(map(lambda x: int(round(x)), plaintextList))

  plaintextList = digitToLetter(plaintextList) # 数字转换为字母

  plaintext = ""

  for item in plaintextList:

  plaintext += item

  return plaintext

  if __name__ == "__main__":

  while True:郑州妇科医院 Http://fk.zyfuke.com/

  print("—————希尔密码—————")

  choice = input("1、加密 2、解密\n请选择:")

  if choice == "1":

  print("输入矩阵:")

  matrix = inputMatrix()

  massage = input("输入msg:")

  massageList = createMassageList(massage, matrix)

  ciphertextList = encrypt(massage, matrix)

  print("加密结果:", ciphertextList)

  elif choice == "2":

  massageList = list(map(int, list(input("输入密文序列:").split(","))))

  print("输入矩阵:")

  matrix = inputMatrix()

  matrix_inverse = createMatrixInverse(matrix)

  print("逆矩阵:")

  for item in matrix_inverse:

  print(item)

  plaintext = decrypt(massageList, matrix)

  print("解密结果:", plaintext)

  其中,求逆矩阵部分未能手算,调用了numpy库中的linalg函数,惭愧………………

  加密测试

  —————希尔密码—————

  1、加密 2、解密

  请选择:1

  输入矩阵:

  1 0 1 1

  0 1 0 1

  1 1 0 0

  1 1 0 1

  输入msg:systemdefenser

  加密结果: [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 1

  0 1 0 1

  1 1 0 0

  1 1 0 1

  逆矩阵:

  [ 0. -1. 0. 1.]

  [ 0. 1. 1. -1.]

  [ 1. 1. 1. -2.]

  [ 0. 0. -1. 1.]

  解密结果: systemdefenser

  加密:

  解密:

  部分代码详解

  输入矩阵部分

  代码片段:

  while True:

  # 输入一行、作为行列式的阶数和行列式的第一行

  rank = list(input("").split())

  matrix = [[0] * len(rank) for i in range(len(rank))]

  matrix[0] = rank

  # 输入行列式剩余数据

  for i in range(1, len(matrix)):

  matrix[i] = list(input("").split())

  # 判断每一行输入是否合法

  if len(matrix[i]) != len(matrix):

  print("输入有误,重新输入。")

  continue

  该片段位于 inputMatrix() 函数中。

  输入矩阵部分未让用户先定义阶数,而是通过用户输入的矩阵第一行,来决定本次矩阵的阶数,并且不断进行合法判断。

  解密部分

  代码片段:

  # 浮点型转换为整型(采用四舍五入——round())

  plaintextList = list(map(lambda x: int(round(x)), plaintextList))

  plaintextList = digitToLetter(plaintextList) # 数字转换为字母

  该片段位于 decrypt(massage, matrix) 函数中。

  由于逆矩阵存在不可约分或整除的小数,因此在此处采用四舍五入round(x) 的方法不严谨地解决此问题。

--结束END--

本文标题: 希尔密码(hill密码)

本文链接: https://lsjlt.com/news/228330.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 希尔密码(hill密码)
      简述  希尔密码是利用矩阵进行加密的一种加密算法,其本质是一种多表代换密码。  百科:  希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。  每个字母当作26进制数字:A=0, B=1, C=2…...
    99+
    2023-06-02
  • python实现希尔密码加密的示例代码
    目录原理实现原理 希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。 每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得...
    99+
    2022-06-02
    python 希尔密码加密 python 希尔密码
  • PHP 中的密码哈希
    PHP 用于服务器端开发,在构建登录和注册过程时需要密码。出于安全目的和隐私问题,我们需要对我们的密码进行哈希处理,这样任何人(包括你和你的数据库管理员)都无法知道用户的密码。 但是,当我们对密码进...
    99+
    2024-02-27
  • 用python的哈希函数对密码加密
    今天我将教大家如何用哈希函数将密码加密加密后的密码是很难倒推的~ 普通加密: 首先调用函数hashlib import hashlib 然后使用哈希函数对密码进行加密这里我使用sha...
    99+
    2024-04-02
  • 使用 Go 根据 /etc/shadow 文件中的哈希密码验证密码
    php小编子墨今天为大家介绍一种使用Go语言验证密码的方法,这个方法是基于读取/etc/shadow文件中的哈希密码进行验证的。在日常开发中,密码验证是一个非常重要的功能,而使用Go语...
    99+
    2024-02-09
    go语言
  • python密码学RSA密码解密教程
    目录授权身份验证RSA密码解密本章是前一章的延续,我们使用RSA算法逐步实现加密,并详细讨论它. 用于解密密文的函数是as跟随 : def decrypt(ciphertext, p...
    99+
    2024-04-02
  • python密码学RSA密码加密教程
    目录加密算法模块 哈希值初始化函数algorithm加密程序的完整代码在本章中,我们将重点介绍RSA密码加密的不同实现及其所涉及的功能.您可以引用或包含此python文件以...
    99+
    2024-04-02
  • MD5密码加密
    什么是MD5加密 MD5消息摘要算法(MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。 MD5加密是一种...
    99+
    2023-09-25
    java 开发语言
  • mysql学习之-密码管理(默认密码,修改密码,解决忘记密码)
    1. mysql安装后默认没有密码,初始化安装后默认密码登录,需要马上修改root密码。 [root@mysql ~]# cat /root/.mysql_secret    --查看r...
    99+
    2024-04-02
  • python密码学Vignere密码教程
    目录Vignere密码数学方程Vignere Tableau实现代码输出Vignere密码 Vignere Cipher包含用于加密和解密的Caesar Cipher算法. Vign...
    99+
    2024-04-02
  • VCSA密码过期修改密码
    一、修改系统密码 使用 vSphere Client 重新引导 vCSA。 cdN3OPWnL2vN7trBoWJfDd0Jlit9sp8lJHO4AIWJG3OcHkVnQ2st...
    99+
    2023-06-04
  • 错误:crypto/bcrypt:hashedPassword 不是给定密码的哈希值
    问题内容 我正在制定一条对用户进行身份验证的路线,当我创建用户时,我将密码保存为哈希值,并在身份验证中创建了此函数来使用 crypto/bcrypt 库验证密码: func (user...
    99+
    2024-02-06
  • MySQL密码加密与解密
    MySQL加密和解密实例详解 有多种前端加密算法可用于数据加密、解密,这是一种简单的数据库级别的数据加密、解密解决方案。 以MySQL数据库为例,它内建了相应的加密函数(AES_ENCRYPT() )和解密函数(AES_DECRY...
    99+
    2022-04-04
    MySQL密码加密与解密
  • laravel-admin密码加密
     saving保存前回调 $form->saving(function (Form $form) { if ($form->password && $form->model()->password != $form->passwor...
    99+
    2023-09-16
    laravel 安全 php
  • mysql无密码如何设置密码
    mysql无密码如何设置密码?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!mysql无密码设置密码的方法:1、使用mysq...
    99+
    2024-04-02
  • 如何查看mysql密码root密码
    本人是个小白,经过实践得出win下mysql的root密码该如何查看,喜欢请收藏哦! 直接上干货!!! 第一步:关闭mysql服务,可以在cmd中关闭(命令:net sopt mysql),也可以直接到服务中关闭。 第二步:以管理员身份运行...
    99+
    2023-10-10
    mysql 数据库 database
  • mysql忘记密码怎么看密码
    要查看已忘记的 mysql 密码,请执行以下步骤:以 root 身份登录 mysql,即使您不知道密码。重置 root 密码。刷新权限以使更改生效。退出并重新登录使用新密码。 如何查看...
    99+
    2024-05-30
    mysql
  • Python:实现密码加密解密(含完整源码)
    Python:实现密码加密解密(含完整源码) 密码加密是保护用户隐私的一种有效手段。本文将讲解如何使用Python编写一个简单的密码加密解密程序,并提供完整源代码。 步骤一:安装依赖库 我们需要使用到...
    99+
    2023-09-11
    python 开发语言
  • Mysql 密码修改 win10 忘记密码 新建用户 更新密码
    Mysql 密码修改 win10 忘记密码 新建用户 更新密码 in10下Mysql8忘记密码,登录及修改Mysql密码 第一步:以管理员身份运行控制台,关闭MySQL服务。 使用命令:net st...
    99+
    2022-02-12
    Mysql 密码修改 win10 忘记密码 新建用户 更新密码
  • Mysql 密码修改 linux 忘记密码 新建用户 更新密码
    Mysql 密码修改 linux 忘记密码 新建用户 更新密码 #mysql -u root -p #输入数据库密码 #select user, host from mysql.user; ...
    99+
    2017-01-08
    Mysql 密码修改 linux 忘记密码 新建用户 更新密码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作