HILL密码

2024-05-27 00:52
文章标签 密码 hill

本文主要是介绍HILL密码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

一:简介

  Hill密码又称希尔密码是运用基本矩阵论原理的替换密码,属于多表代换密码的一种,由L e s t e r S . H i l l Lester S. HillLesterS.Hill在1929年发明。

二:原理

  1.对于每一个字母,我们将其转化为对应的数字,一般来说我们使用的是 A AA 对应的 0 ,B对应的 1然后一次类推,当然你也可以自己指定一个字母表,然后一一对应。
  2.我们将明文转化为一个1维的向量 (即:1 × n 的矩阵)。
  3.然后我们将这个1维的向量和一个 n × n 的密钥矩阵相乘,得到一个1维的向量,然后对这个矩阵模上26。
  4.然后再通过字母表将这个n维矩阵转化为密文。
 

解密 的话只需要将密文乘上密文矩阵的逆矩阵就好啦,Hill 密码能较好地抵抗统计分析法,对抗唯密文攻击的强度较高,但易受到已知明文攻击。破译的难度也会随着矩阵的阶数规模变大变得难以破解。

三:举例

我们的明文为:ACM,我们想将其加密,我们得到的一个密钥矩阵如下:

  1. 我们将明文转为一个1维向量:

     2.对两个矩阵做一个乘法

     3.将新得到的1维向量按照字母表转化为密文:

python代码实现如下:

#include<bits/stdc++.h>
using namespace std;
#define N 100
#define mod 26
struct Matrix{int n,m;int mp[N][N];void init(int n,int m) {this->n = n;this->m = m;for(int i = 0;i <= n; ++i) for(int j = 0;j <= m; ++j)mp[i][j] = 0;}
};Matrix mult(Matrix L,Matrix R) {//乘法if(L.m != R.n) return L;Matrix M;M.init(L.n,R.m);for(int i = 0;i < L.n; ++i) {for(int j = 0;j < R.m; ++j){for(int k = 0;k < L.m; ++k) {M.mp[i][j] = (M.mp[i][j] + L.mp[i][k] * R.mp[k][j]) % mod;}}}return M;
}void HIll(){Matrix a,b;string S;cout<<"请输入需要加密的明文"<<endl;cin>>S;transform(S.begin(),S.end(),S.begin(), ::toupper);int len = S.size();cout<<"请输入"<<len<<"X"<<len<<"的密钥矩阵"<<endl;a.init(len,len);b.init(1,len);for(int i = 0;i < len; ++i)for(int j = 0;j < len; ++j)scanf("%d",&a.mp[i][j]);for(int i = 0;i < len; ++i) b.mp[0][i] = int(S[i] - 'A');for(int i = 0;i < len; ++i) cout<<b.mp[0][i]<<" \n"[i == len-1];Matrix c = mult(b,a);string ans = "";for(int i = 0;i < len; ++i)ans += char('A' + c.mp[0][i]);cout<<"加密后的密文为:\n"<<ans<<endl;
}int main()
{HIll();return 0;
}
/*
ACM
2 1 1
3 2 1
2 1 2ans = EQA
----------------
ACT
6 24 1
13 16 10
20 17 15	ans = QRT
----------------
cyber
10 5 12 0 0
3 14 21 0 0
8 9 11 0 0
0 0 0 11 8
0 0 0 3 7
ans = WRTRV
*/

运行结果:

 

矩阵求逆原理:(Gauss-Jordan)高斯消元法求逆矩阵(含C/C++实现代码)-CSDN博客

(本人不才,请看别人的)

这篇关于HILL密码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1006065

相关文章

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

mysql导出导入数据和修改登录密码

导出表结构: mysqldump -uroot -ppassword -d dbname tablename>db.sql; 导出表数据: mysqldump -t dbname -uroot -ppassword > db.sql 导出表结构和数据(不加-d): mysqldump -uroot -ppassword dbname tablename > db.sql;

Ubuntu 环境下ssh的安装、使用以及免密码登录

以两台机器为例:     A12.12.10.11B12.12.10.13 安装: Ubuntu默认安装了ssh客户端,只需要在被登录的机器上安装ssh服务器即可: $ sudo apt-get install openssh-server     启动ssh服务器: $ sudo /etc/init.d/ssh start 查看是否启动成功: $ ps -ef |grep

ubuntu 20.04 一直卡在登录界面,即使密码正确也无法登录(失败记录)

ubuntu 20.04 一直卡在登录界面,即使密码正确也无法登录 这次是装实体机,一次失败的尝试。。。 名称型号CPUIntel Xeon E5-2673 V3GPURTX 3060 mobile 安装的时候不要选install third-party software for graphics and Wi-fi hardware and additional media

oracle密码维护

查看密码是否可以重复使用 SQL> select PROFILE,RESOURCE_NAME,LIMIT from dba_profiles where profile='DEFAULT' and resource_type ='PASSWORD'; PROFILE                        RESOURCE_NAME                    LIMIT ----

【网络安全】古典密码体制概述

1. 古典密码体制概述 1.1 定义与历史背景 古典密码体制是指在计算机科学和信息安全技术出现之前的传统加密方法。这些方法主要包括替换和易位两种基本形式。古典密码体制的特点是简单、易用,但安全性不高,容易被破解。在古代,人们使用纸、笔或简单的器械来实现加密和解密操作。 定义:古典密码体制是基于简单数学运算和文字替换的加密方法,包括替代密码和置换密码两大类。历史背景:古典密码的使用可以追溯到古

vsftpd配置用户和密码让其他客户端连接

一、第一个主机:vsftpd下载及配置 前置准备: #卸载防火墙yum -y remove firewalld#为了不让防火墙有影响,iptables配置也清空iptables -Fvim /etc/selinux/confSELINUX=disabled #主要是把它改为disabled或者permissiveSELINUXTYPE=targeted#重启linux让selin

【linux mysql】mysql高版本8.0.23版本密码修改总结

mysql 8.0 版本,由于增加了一些安全策略等限制,所以修改用户密码会稍微麻烦些。下面是针对这个高版本的总结。 一、配置/etc/my.cnf 文件 免密码登录mysql vim /etc/my.cnf# 增加这两行命令skip-grant-tablesdefault-authentication-plugin=mysql_native_password 重启启动mysql se