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博客

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程——创建进程fork

一、fork 主要概念: 父进程与子进程 ​ 创建新进程的那个进程称为父进程,新进程称为子进程。使用 fork() 函数创建子进程。 fork() 函数能创建一个与调用进程几乎完全相同的子进程,包括代码、数据段、堆栈以及当前工作目录、用户ID和组ID等环境变量 相关函数: #include…

UneMeta与日本顶级IP熊本熊合作,首个NFT玩法揭秘

UneMeta 生态是一个备受加密市场以及动漫 IP 市场关注的老牌 Web3 数字资产平台&#xff0c;旨在架起现实艺术 IP 和 NFT 艺术社区之间的桥梁&#xff0c;以促进 Web3 社区的包容性和多样性。并期望基于生态一流的产品体验和平台属性&#xff0c;打造一个包容交汇的元宇宙社区。…

Linux中本地yum仓库的搭建

搭建本地yum仓库 本地文件方式FTP传输方式HTTP传输方式 本地文件方式 创建文件夹 mkdir /iso /repo将系统镜像上传到服务器&#xff0c;之后将镜像挂在到本地目录 mount -o ro /iso/CentOS-7-x86_64-DVD-2009_2.iso /repo/之后我们配置repo文件 cd /etc/yum.repos.d cat &g…

MDK安装

MDK安装 1 MDK的差异2 切换MDK3 安装芯片支持包注意点 1 MDK的差异 不同版本MDK有略微的差别&#xff0c;比如&#xff1a;MDK536.EXE&#xff0c;支持版本5的交叉编译链。如下图所示&#xff1a; 而MDK539.EXE不支持版本5的交叉编译链&#xff0c;所以工作的时候&#xff0c…

anaconda的安装和使用

anaconda的安装和使用 Anaconda 是一个用于科学计算和数据分析的开源发行版&#xff0c;包含了Python和R的众多包和管理工具。以下是Anaconda的安装和使用指南&#xff1a; 1. 安装Anaconda 1.1 下载Anaconda 访问 Anaconda官网 下载适用于你操作系统的Anaconda安装包。 1.2 安…

嵌入式学习(Day:27 线程2)

线程控制&#xff1a;互斥与同步 &#xff08;排他性访问&#xff0c;只能一个访问&#xff09; 1. 互斥 概念&#xff1a; 互斥 》在多线程中对临界资源的排他性访问。 &#xff08;临界资源如&#xff1a;全局变量a&#xff09; 互斥机制 》互斥锁 》保证临界资…

【C语言】自定义类型:联合体和枚举

1. 联合体 1.1 联合体的特点 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。 但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间所以联合体也叫&#xff1a;共⽤体。 union Un {char…

K8s的CRI机制是什么?

1. 概述 进入 K8s 的世界&#xff0c;会发现有很多方便扩展的 Interface&#xff0c;包括 CRI, CSI, CNI 等&#xff0c;将这些接口抽象出来&#xff0c;是为了更好的提供开放、扩展、规范等能力。 K8s CRI(Container Runtime Interface) 是 K8s 定义的一组与容器运行时进行交…

入门Kotlin的学习之路经验总结

书籍的话就推荐三本书&#xff0c;分别是【Kotlin实战】&#xff0c;【Kotlin核心编程】、【Kotlin编程实践】。这三本书个人认为理解和学习的难易程度由低到高。如果你是入门Kotlin&#xff08;首先掌握基础&#xff09;&#xff0c;强烈推荐【Kotlin实战】这本书&#xff0c;…

八种单例模式

文章目录 1.单例模式基本介绍1.介绍2.单例模式八种方式 2.饿汉式&#xff08;静态常量&#xff0c;推荐&#xff09;1.基本步骤1.构造器私有化&#xff08;防止new&#xff09;2.类的内部创建对象3.向外暴露一个静态的公共方法 2.代码实现3.优缺点分析 3.饿汉式&#xff08;静态…

C#基础语言

​​​​ 目录 一个c# 程序主要包括以下部分&#xff1a;​​​​​​​ 标识符 C# 关键字 C# 数据类型 值类型&#xff08;Value types&#xff09; 引用类型&#xff08;Reference types&#xff09; 对象&#xff08;Object&#xff09;类型 动态&#xff08;Dynam…

Python应用实战,用动画生成冒泡排序的过程

写在前言 hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎关注交流。 希望可以持续更新一些有意思的文章&#xff0c;如果觉得还不错&#xff0c;欢迎点赞关注&#xff0c;有啥想说的&#x…

网络通信--demo--群聊

群聊实现的关键&#xff1a; 群聊的思想&#xff1a;客户端发送消息后&#xff0c;所有客户端都可以接收到 客户端---->服务端&#xff08;子&#xff09;---->客户端&#xff08;online&#xff09; online的客户端&#xff1a;需要一个集合存储 package Wechat;imp…

牛客NC222 插入区间【中等 数组,区间合并问题 Java/Go/PHP/C++】lintcode30 插入区间

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/1d784b5472ab4dde88ea2331d16ee909 https://www.lintcode.com/problem/30/solution/56586 思路 Java代码 import java.util.*;/** public class Interval {* int start;* int end;* public Interval(int …

Julia编程08:控制流Control Flow

Julia provides a variety of control flow constructs: Compound Expressions: begin and ;. Conditional Evaluation: if-elseif-else and ?: (ternary operator). Short-Circuit Evaluation: logical operators && (“and”) and || (“or”), and also chained …

【代码随想录训练营】【Day 32】【回溯-6】【待二刷】| Leetcode 332, 51, 37

【代码随想录训练营】【Day 32】【回溯-6】【待二刷】| Leetcode 332, 51, 37 需强化知识点 滑动窗口&#xff0c;固定结束位置版本螺旋数组&#xff0c;建模为编程问题 题目 332. 重新安排行程 sort reverse的用法&#xff0c;以及result.append(airport)的理解 from co…

i2c总线介绍

1. 简介 1.1 I2C总线的历史背景 I2C&#xff08;Inter-Integrated Circuit&#xff09;总线最初由Philips Semiconductors&#xff08;现NXP Semiconductors&#xff09;在1980年代开发&#xff0c;旨在简化集成电路之间的通信。随着技术的发展&#xff0c;I2C已经成为一种广…

【数据结构】哈希表的原理及其实现

文章目录 哈希表的概念哈希函数的设计常见的哈希函数 哈希冲突1. 闭散列代码实现 2. 开散列拉链法的优点 针对开散列哈希的扩展基于开散列拉链法封装哈希表MyHash.h 基于哈希表实现unordered_map类Myunordered_map.h 基于哈希表实现unordered_set类Myunordered_map.h 哈希表的概…

匠心独运的掺Si量子势垒策略,显著提升了AlGaN基深紫外LED出光率

WHU团队凭借匠心独运的三明治式掺Si量子势垒策略&#xff0c;显著提升了AlGaN基深紫外光LED的效率&#xff0c;这一创新成果为中国武汉大学的研究团队所取得。他们巧妙地设计出一种三明治状Si掺杂&#xff08;未掺杂&#xff09;方案&#xff0c;应用于Al0.6Ga0.4N量子势垒中&a…

WSL安装CentOS系统

1.首选找一个linux系统&#xff0c;执行docker命令 docker run -it --rm centos:7 bash 2.开一个新窗口&#xff0c;将系统导出 docker export e0ee25406703 -o centos.tar 3.切换到wsl命令&#xff0c;导入tar包 wsl --import centos D:\wsl\centos D:\wsl\centos.tar cen…