hill密码(希尔密码)

简述

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

  • 百科:
    希尔密码是运用基本矩阵论原理的替换密码,由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 createMatri
  • 27
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值