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 前言 天下武功,唯快不破.但在密码学中则不同.算法越快,越容易破. ...
随机推荐
- 一些实用但不为人知的Unix命令
浮现在脑海的很多 Linux命令,其中一些不为人知,另一些则很常见,如下: xargs or parallel: 并行运行一些程序,命令有很多的选项 sed and awk: 广为人知并且非常有用的处 ...
- WP修改ProgressBar的前景色
重载默认主题中的值,修改ProgressBar的前景色 做一个小项目时,用到 ProgressBar添加一个加载效果,但是背景不是白色的,调试时发现自己选的主题色与背景色相近,特别不清晰,加载效果几乎 ...
- .NET破解之100%营销QQ辅助软件【更新】
应网友要求,更新一个以前的版本,效果如下: 更改方法 修改一:更改对象的可访问性 Assembly: RWXComLibrary, Version=2.1.0.3 Name: RWXComLibrar ...
- Ettercap中间人攻击--介绍
前言 Ettercap有四种界面:Text,Curses,GTK2,Daemonize. -T 命令行界面,只显示字符.通常与配套的参数有-q(安静模式),加上该选项,则不会显示抓到的数据包 ...
- SharePoint 2013 内容部署功能简介
在之前的项目中,当客户有新的需求的时候,我们通常在测试环境上开发或者实施,然后手动在生产环境再弄一次.当发现内容部署这个东西,才知道这样是多么不合理的.我们可以创建两个网站集,一个用来修改,然后通过计 ...
- 转:Eclipse 一直不停 building workspace... 完美解决总结
原文地址: Eclipse 一直不停 building workspace... android开发论坛 juapk 完美解决总结 一.产生这个问题的原因多种 1.自动升级 2.未正确关闭 3.ma ...
- PL/SQL基础2(笔记)
1 第一个PL/SQL的程序 DECLARE BEGIN DBMS_OUTPUT.PUT_LINE('Hello World!'); END; / --2一个简单的PL/SQL程序 DECLARE v ...
- 选择排序(java版)
public class SelectSortTest { public static void selectSort(int[] source) { for (int i = 0; i < s ...
- Effective Java 15 Minimize mutability
Use immutable classes as much as possible instead of mutable classes. Advantage Easy to design, impl ...
- 用js获取当前页面的url的相关信息方法
当前页面对应的URL的一些属性: ( http://bbs.xxx.net/forum.php?mod=viewthread&tid=2709692&page=1&extra= ...