Hill密码
希尔密码(Hill Password)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。每个字母当作26进制数字:A=, B=, C=... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD26。注意用作加密的矩阵(即密匙)在\mathbb_^n必须是可逆的,否则就不可能译码。只有矩阵的行列式和26互质,才是可逆的 #include<stdio.h> #include<string.h> #include<ctype.h> #include<stdlib.h> ][];//转化矩阵 ][];//单位矩阵[A E] ][];//矩阵的逆矩阵A^(-1) ][];//明文矩阵 ][];//密文矩阵 int n;//矩阵的阶数 void input()//输入数据 { int i, j; ; i <= n; i++ ) ; j <= n; j++ ) A[i][j] = rand() % ; memcpy( a, A, sizeof( A ) );//将矩阵A复制给a ; i <= n; i++ )//将矩阵变成[a E]的形式,E为单位矩阵 { ; j <= *n; j++ ) { if( i + n == j ) a[i][j] = ; else a[i][j] = ; } } } void output() //输出函数 { int i,j; printf("矩阵A的元素\n"); ; i <= n; i++ ) { ; j <= n; j++ ){ printf("%d ",A[i][j]); } printf("\n"); } printf("A矩阵的逆矩阵B为\n"); ; i <= n; i++ )//输出A矩阵的逆矩阵B { ; j <= n; j++ ) { B[i][j] = a[i][j+n]; printf("%d ",B[i][j]); } printf("\n"); } } int Extend_Gcd( int a, int b, int &x, int &y )//扩展欧几里得算法 { ) { x = ; y = ; return a; } int r = Extend_Gcd( b, a % b, x, y ); int t = x; x = y; y = t - a / b * y; return r; } int ni( int a)//求逆a*x=1(mod n) { int x, y; , x, y ); ) + ) % ; else ; } int gaosi()//高斯-约当消元求A矩阵的逆矩阵B { int i, j, k; ; k <= n; k++ )//高斯-约当消元 { int Ni = ni( a[k][k] ); ) ; ; i <= * n; i++ ) a[k][i] = ( a[k][i] * Ni % + ) % ; ; i <= n; i++ ) { if( i == k ) continue; ; j <= * n; j++ ) a[i][j] = ( ( a[i][j] - a[i][k] * a[k][j] % ) % + ) % ; } } ; } void jiami() //加密过程 { int i, j, k; ]; char mingc; printf("请输入明文"); scanf("%s",&mingstr); int len = strlen( mingstr ); if( len % n ) { for( i = len; i < len/n*n+n; i++) mingstr[i] = 'a'; mingstr[i] = '\0'; } puts( mingstr ); int Len = strlen( mingstr ); ; i <= Len/n; i++ )//将明文分成len/n段 { ; j <= n; j++ )//求每一段的明文转换为矩阵 { )*n+j-] >= )*n+j-] <= 'z' ) ming[i][j] = mingstr[(i-)*n+j-] - 'a'; else ming[i][j] = mingstr[(i-)*n+j-] - 'A'; } } ; k <= Len/n; k++ )//求len/n段的密文矩阵 { ; i <= n; i++ )//利用矩阵的乘法 { mi[k][i] = ; ; j <= n; j++ ) mi[k][i] = ( mi[k][i] + ming[k][j] * A[j][i] % + ) % ; } } printf("密文为"); ; i <= Len/n; i++ )//输出密文 { ; j <= n; j++ ) { mingc = mi[i][j] + 'A'; printf("%c",mingc); } } printf("\n"); } void jiemi() //解密过程 { int i, j, k; ]; char mingc; printf("请输入密文"); scanf("%s",&mistr); int len = strlen( mistr ); ; i <= len/n; i++ )//将密文分成len/n段 { ; j <= n; j++ )//求每一段的密文转换为矩阵 { )*n+j-] >= )*n+j-] <= 'z' ) mi[i][j] = mistr[(i-)*n+j-] - 'a'; else mi[i][j] = mistr[(i-)*n+j-] - 'A'; } } ; k <= len/n; k++ )//求len/n段的明文矩阵 { ; i <= n; i++ )//利用矩阵的乘法 { ming[k][i] = ; ; j <= n; j++ ) ming[k][i] = ( ming[k][i] + mi[k][j] * B[j][i] % + ) % ; } } printf("明文为"); ; i <= len/n; i++ )//输出明文 { ; j <= n; j++ ) { mingc = ming[i][j] + 'A'; printf("%c",mingc); } } printf("\n"); } int main() { int flag; do{ printf( "1.加密2.解密3.退出\n"); scanf("%d",&flag); ) {printf("请输入加密矩阵的阶数n:"); scanf("%d",&n); do{ input();//数据输入 }while( !gaosi() ); output(); jiami();}//加密过程 ) {jiemi();//解密过程 } &&flag!=&&flag!=) printf("输入错误,请重新输入!\n"); }); ; }
Hill密码的更多相关文章
- 信息安全-2:python之hill密码算法[原创]
转发注明出处:http://www.cnblogs.com/0zcl/p/6106513.html 前言: hill密码算法我打算简要介绍就好,加密矩阵我用教材上的3*3矩阵,只做了加密,解密没有做, ...
- Hill密码解密过程(Java)
Hill密码是一种传统的密码体系.加密原理:选择一个二阶可逆整数矩阵A称为密码的加密矩阵,也就是这个加密体系的密钥.加密过程: 明文字母依次逐对分组,例如加密矩阵为二阶矩阵,明文就两个字母一组,如果最 ...
- javascript实现playfair和hill密码算法
时至期末,补习信息安全概论作业.恰巧遇古典密码学算法中的playfair算法和hill算法,用javascript语言实现起来是在有趣,边查百度边编码,顺便好好补习一下javascript基础. pl ...
- 4 多表代替密码之Hill 密码 2实现
该解密方法的KEY 不是一个数或者一段字符串,而是一个矩阵, 比如有个3*3的KEY: 那么如果我们要加密一个长度为N的字符串, 那么把N除以3,分成M个3个字母组成的小段, 对每个小段尽心加密: 1 ...
- 4 多表代替密码之Hill 密码_1 矩阵工具类
在说明Hill加密之前要先复习线性代数的知识,主要是关于矩阵的一些运算和概念. 一.矩阵的逆: 定义方阵M的逆矩阵应该满足M*M^-1==I,其中I是单位矩阵,比如: 但是这个地方是对英文字母进行加密 ...
- 信息安全-1:python之playfair密码算法详解[原创]
转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...
- 希尔密码(Hill Cipher)的实现
原理应该不用多讲了,自己百度就可以. C++实现: #include <iostream> #include <string> #include <memory.h> ...
- ctf古典密码从0到
本文首发于“合天智汇”公众号 作者:淡灬看夏丶恋雨 古典密码和现代密码的区别: 代换密码 单表代换密码 字符或数学型 凯撒密码 仿射密码 四方密码 培根密码 图表 标准银河字母 圣堂武士密码 猪圈密码 ...
- 对抗密码破解 —— Web 前端慢 Hash
(更新:https://www.cnblogs.com/index-html/p/frontend_kdf.html ) 0x00 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
随机推荐
- [js开源组件开发]图片放大镜
图片放大镜 一般情况下,手机由于屏幕太小,会有图片上看不清的问题,所以我就做了一个放大镜的js效果,支持pc和移动端.它的原理是利用的backgroundsize来实现的,所以你的浏览器首先要支持这个 ...
- IOS6学习笔记(三)
1.ARC空声明变量 使用ARC的另一个优势是所有未初始化的变量默认都是“空值化”的.这意味着像下面这样的声明使用ARC编译后指向的是空值(nil): NSObject *myObject1,*myO ...
- 消除 activity 启动时白屏、黑屏问题
默认情况下 activity 启动的时候先把屏幕刷成白色,再绘制界面,绘制界面或多或少有点延迟,这段时间中你看到的就是白屏,显然影响用户体验,怎么消除呢? 在 Activity theme 设置sty ...
- UITabBarItem的selectedImage
TabBar使用频率很高的一个组件,TabBar的TabBarItem有两个属性一个是image(未选中图片),另一个是selectedImage(选中时图片) 但是运行时发现,选中时的图片变成了蓝色 ...
- Spring中配置数据源的4种形式(转)
原文http://blog.csdn.net/orclight/article/details/8616103 不管采用何种持久化技术,都需要定义数据源.Spring中提供了4种不同形式的 ...
- UnityShader之顶点片段着色器Vertex and Fragment Shader【Shader资料】
顶点片段着色器 V&F Shader:英文全称Vertex and Fragment Shader,最强大的Shader类型,也是我们在使用ShaderLab中的重点部分,属于可编程管线,使用 ...
- CocoaPods:管理Objective-c 程序中各种第三方开源库关联
在我们的iOS程序中,经常会用到多个第三方的开源库,通常做法是去下载最新版本的开源库,然后拖拽到工程中. 但是,第三方开源库的数量一旦比较多,版本的管理就非常的麻烦.有没有什么办法可以简化对第三方库的 ...
- UIViewController的edgesForExtendedLayout属性
UIViewController的edgesForExtendedLayout属性 想必大家都遇到一种情况,明明y坐标设置的是0,但是总是被讨厌的导航栏给遮住.比如下面这个情况: UILabel *l ...
- IOS开发--常用工具类收集整理(Objective-C)(持续更新)
前言:整理和收集了IOS项目开发常用的工具类,最后也给出了源码下载链接. 这些可复用的工具,一定会给你实际项目开发工作锦上添花,会给你带来大大的工作效率. 重复造轮子的事情,除却自我多练习编码之外,就 ...
- mysql登录和连接 权限
在一些配置中会要求登录mysql 授权的时候注意ip地址是ip地址,localhost是localhost,在grant授权时,如果用localhost,就必须在所登录的配置文件中使用localhos ...