导航:首页 > 文档加密 > hill密码加密c

hill密码加密c

发布时间:2022-08-22 17:20:20

⑴ 希尔密码的介绍

希尔密码(Hill Password)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD26。注意用作加密的矩阵(即密匙)在mathbb_^n必须是可逆的,否则就不可能译码。只有矩阵的行列式和26互质,才是可逆的。

⑵ 什么是希尔密码

希尔密码(Hill Password)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。注意用作加密的矩阵(即密匙)在\mathbb_^n必须是可逆的,否则就不可能译码。只有矩阵的行列式和26互质,才是可逆的。

希尔密码是基于矩阵的线性变换,希尔密码相对于前面介绍的移位密码以及放射密码而言,其最大的好处就是隐藏了字符的频率信息,使得传统的通过字频来破译密文的方法失效.希尔密码不是足够安全的,如今已被证实。

⑶ 希尔密码原理

希尔密码(Hill Cipher)是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果MOD26。

中文名
希尔密码
外文名
Hill Cipher
原理
基本矩阵论
类别
替换密码
提出者
Lester S. Hill
快速
导航
产生原因

原理

安全性分析

例子
简介
希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。
每个字母当作26进制数字:A=0, B=1, C=2... 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得出的结果模26。
注意用作加密的矩阵(即密匙)在必须是可逆的,否则就不可能解码。只有矩阵的行列式和26互质,才是可逆的。
产生原因
随着科技的日新月异和人们对信用卡、计算机的依赖性的加强,密码学显得愈来愈重要。密码学是一门关于加密和解密、密文和明文的学科。若将原本的符号代换成另一种符号,即可称之为广义的密码。狭义的密码主要是为了保密,是一种防止窃文者得知内容而设的另一种符号文字,也是一般人所熟知的密码。
使用信用卡、网络账号及密码、电子信箱、电子签名等都需要密码。为了方便记忆,许多人用生日、电话号码、门牌号码记做密码,但是这样安全性较差。
为了使密码更加复杂,更难解密,产生了许多不同形式的密码。密码的函数特性是明文对密码为一对一或一对多的关系,即明文是密码的函数。传统密码中有一种叫移位法,移位法基本型态是加法加密系统C=P+s(mod m)。一般来说,我们以1表示A,2表示B,……,25表示Y,26表示Z,以此类推。由于s=0时相当于未加密,而0≤s≤m-1(s≥m都可用0≤s≤m-1取代),因此,整个系统只有m-1种变化。换言之,只要试过m-1次,机密的信息就会泄漏出去。
由此看来,日常生活中的密码和传统的密码的可靠性较差,我们有必要寻求一种容易将字母的自然频度隐蔽或均匀化,从而有利于统计分析的安全可靠的加密方法。希尔密码能基本满足这一要求。
原理
希尔加密算法的基本思想是,将d个明文字母通过线性变换将它们转换为d个密文字母。解密只要作一次逆变换就可以了,密钥就是变换矩阵本身。[1]
希尔密码是多字母代换密码的一种。多字母代换密码可以利用矩阵变换方便地描述,有时又称为矩阵变换密码。令明文字母表为Z,若采用L个字母为单位进行代换,则多码代换是映射f:Z→Z。若映射是线性的,则f是线性变换,可以用Z上的L×L矩阵K表示。若是满秩的,则变换为一一映射,且存在有逆变换K。将L个字母的数字表示为Z上的L维矢量m,相应的密文矢量c,且mK=c,以K作为解密矩阵,可由c恢复出相应的明文c·K=m。
在军事通讯中,常将字符(信息)与数字对应(为方便起见,我们将字符和数字按原有的顺序对应,事实上这种对应规则是极易被破解的):
abcde…x y z
12345…242526
如信息“NOSLEEPPING”对应着一组编码14,15,19,12,5,5,16,16,9,14,7。但如果按这种方式直接传输出去,则很容易被敌方破译。于是必须采取加密措施,即用一个约定的加密矩阵K乘以原信号B,传输信号为C=KB(加密),收到信号的一方再将信号还原(破译)为B=KC。

⑷ 希尔密码的Hill cipher

三、Hill cipher(希尔密码)
Hill cipher是1929年提出的一种密码体制。
设d是一正整数,定义。Hill cipher的主要思想是利用线性变换方法,不同的是这种变换是在 上运算。
例如:设d=2,每个明文单元使用 来表示,同样密文单元用 表示,具体的加密中, 将被表示为 的线性组合。
如:
利用线性代数的知识,可得
这个运算在 上进行,即mod26,密钥K一般取一个m*m的矩阵,记为。对明文 ,以 ,则加密算法为:
也可表示成。

⑸ C++实现古典密码Hill体制的加密解密的程序

这是C的,且基于的是ASCII码,大致改一改吧。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>

struct hill
{
int i,j;
int s[10][10];
}a[3],b;

struct hill mul(struct hill,struct hill);
int det(struct hill,int,int);
struct hill inv(struct hill);
void code();
void uncode();

FILE *word,*num;

void main()
{
int i=0,j=0,k=0;
word=fopen("word.txt","r");
num=fopen("num.txt","r");
if(word==NULL||num==NULL)
{
printf("Error!\n");
exit(0);
}
fclose(word);
fclose(num);

while(!i)
{
fflush(stdin);
printf("输入密码\n");
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
a[k].s[i][j]=getchar();
if(a[k].s[i][j]=='\n') break;
}
if(a[k].s[i][0]=='\n') break;
}
for(a[k].j=0;a[k].s[0][a[k].j]!='\n';a[k].j++);
for(a[k].i=0;a[k].s[a[k].i][0]!='\n';a[k].i++) a[k].s[a[k].i][a[k].j]=0;
for(i=0;i<a[k].i;i++) for(j=0;j<a[k].j;j++) a[k].s[i][j]=a[k].s[i][j]-'a';
i=0;
if(a[k].i==a[k].j)
{
if(det(a[k],a[k].i,a[k].j)%2!=0&&det(a[k],a[k].i,a[k].j)%13!=0)
{
printf("是(0)否(1)继续输入?:");
scanf("%d",&i);
k++;
}
else printf("密码不合格!\n");
}
else printf("密码不合格!\n");
}

while(i)
{
printf("1:加密 2:解密\n");
scanf("%d",&i);
switch(i)
{
case 1: code(); break;
case 2: uncode(); break;
default: i=0;
}
}

}

struct hill mul(struct hill a,struct hill b)
{
int i=0,j=0,k=0;
struct hill ans;
ans.i=a.i;
ans.j=b.j;
for(i=0;i<ans.i;i++)
{
for(j=0;j<ans.j;j++)
{
ans.s[i][j]=0;
for(k=0;k<a.j;k++)
ans.s[i][j]=ans.s[i][j]+a.s[i][k]*b.s[k][j];
}
}
for(i=0;i<ans.i;i++)
{
for(j=0;j<ans.j;j++) ans.s[i][j]=(ans.s[i][j]%26+26)%26+'a';
ans.s[i][j]='\0';
}
return(ans);
}

struct hill inv(struct hill a)
{
char c;
int i=0,j=0,k=0;
struct hill ans;
ans.i=a.i;
ans.j=a.j;
switch(det(a,a.i,a.j)%26)
{
case 1: k=1; break;
case 3: k=9; break;
case 5: k=21; break;
case 7: k=15; break;
case 9: k=3; break;
case 11: k=19; break;
case 15: k=7; break;
case 17: k=23; break;
case 19: k=11; break;
case 21: k=5; break;
case 23: k=17; break;
case 25: k=25; break;
}
for(i=0;i<ans.i;i++)
{
for(j=0;j<ans.j;j++)
ans.s[i][j]=(((int)pow(-1,i+j)*det(a,i,j)*k)%26+26)%26;
}
for(i=0;i<ans.i;i++) ans.s[i][ans.j]='\0';
for(i=0;i<ans.i;i++)
{
for(j=0;j<i;j++)
{
c=ans.s[i][j];
ans.s[i][j]=ans.s[j][i];
ans.s[j][i]=c;
}
}
return(ans);
}

int det(struct hill a,int m,int n)
{
int i=0,j=0,x=0;
if(m!=a.i||n!=a.j)
{
for(i=0;i<a.i;i++) for(j=n;j<a.j;j++) a.s[i][j]=a.s[i][j+1];
for(i=m;i<a.i;i++) for(j=0;j<a.j;j++) a.s[i][j]=a.s[i+1][j];
a.i--;
a.j--;
}
if(a.i==2&&a.j==2) return(a.s[0][0]*a.s[1][1]-a.s[0][1]*a.s[1][0]);
for(i=0;i<a.i;i++) x+=a.s[0][i]*det(a,0,i)*(int)pow(-1,i);
return(x);
}

void code()
{
int i=0,j=0,space[10],k=0,n=0;
struct hill ans;
char c=0;
word=fopen("word.txt","r");
c=fgetc(word);
while(c!=EOF)
{
if(c>='a'&&c<='z') n++;
c=fgetc(word);
}
fclose(word);
word=fopen("word.txt","r");
num=fopen("num.txt","w");
while(n)
{
printf("剩余%d: ",n);
scanf("%d",&j);
n=n-j;
for(k=0;a[k].i!=j;j++);
b.i=a[k].i;
b.j=1;
for(j=0;j<10;j++) space[j]=-1;
j=0;
for(i=0;i<b.i;i++)
{
b.s[i][0]=fgetc(word);
if(b.s[i][0]<'a'||b.s[i][0]>'z')
{
space[j]=i;
j++;
b.s[i][0]=fgetc(word);
}
}
for(i=0;i<b.i;i++)
{
b.s[i][0]-='a';
b.s[i][1]='\0';
}
ans=mul(a[k],b);
for(i=0;i<ans.i;i++)
{
for(j=0;j<10;j++) if(i==space[j]) break;
if(j!=10) fprintf(num," %c",ans.s[i][0]);
else fprintf(num,"%c",ans.s[i][0]);
}
}
fclose(word);
fclose(num);
}

void uncode()
{
int k=0,n=0;
int i=0,j=0,space[10];
struct hill ans;
char c=0;
word=fopen("num.txt","r");
c=fgetc(word);
while(c!=EOF)
{
if(c>='a'&&c<='z') n++;
c=fgetc(word);
}
fclose(word);
word=fopen("word.txt","w");
num=fopen("num.txt","r");
b.i=a[k].i;
b.j=1;
while(n)
{
printf("剩余%d: ",n);
scanf("%d",&j);
n=n-j;
for(k=0;a[k].i!=j;j++);
b.i=a[k].i;
b.j=1;
for(j=0;j<10;j++) space[j]=-1;
j=0;
for(i=0;i<b.i;i++)
{
b.s[i][0]=fgetc(num);
if(b.s[i][0]<'a'||b.s[i][0]>'z')
{
space[j]=i;
j++;
b.s[i][0]=fgetc(num);
}
}
for(i=0;i<b.i;i++)
{
b.s[i][0]-='a';
b.s[i][1]='\0';
}
ans=mul(inv(a[k]),b);
for(i=0;i<ans.i;i++)
{
for(j=0;j<10;j++) if(i==space[j]) break;
if(j!=10) fprintf(word," %c",ans.s[i][0]);
else fprintf(word,"%c",ans.s[i][0]);
}
}
fclose(word);
fclose(num);
}

⑹ 哪位高人能帮忙用C语言写一个HILL的加密算法啊

不就是矩阵乘法嘛。
为了防止溢出,你只需要多次取余即可。
具体可以参考hill的原理。随便一搜就有。

⑺ 希尔密码求解

希尔加密算法的基本思想是,将d个明文字母通过线性变换将它们转换为d个密文字母。解密只要作一次逆变换就可以了,密钥就是变换矩阵本身。如信息“NOSLEEPPING”对应着一组编码14,15,19,12,5,5,16,16,9,14,7。但如果按这种方式直接传输出去,则很容易被敌方破译。于是必须采取加密措施,即用一个约定的加密矩阵K乘以原信号B,传输信号为C=KB(加密),收到信号的一方再将信号还原(破译)为B=KC。如果敌方不知道加密矩阵,则很难破译。
解密
第一步,求密匙矩阵K的逆矩阵[2]K。K可用Mathematica计算。
Inverse123-120213∥MatrixForm=-614-3125-1-3,
即K=-614-3125-1-3。
第二步,由得Y=KX得X=KY(i=1,2,3,4),再次进行矩阵乘法运算:
X=KY=-614-3125-1-3671610=141519;
X=KY=-614-3125-1-327-244=1255;
X=KY=-614-3125-1-3501675=16169;
X=KY=-614-3125-1-321035=1470。
这样原来的信息编码为14,15,19,12,5,5,16,16,9,14,7。
第三步,对照编码表,即可获得对方发来的信息内容为“NOSLEEPPING”。

阅读全文

与hill密码加密c相关的资料

热点内容
爱情电影网站apdy 浏览:716
用什么看刚出的枪版电影 浏览:362
有一本小说女主叫苏晚 浏览:551
韩国大尺度来电 浏览:14
朴银狐妻子的职业电影 浏览:821
国产强奸的大尺度电影有哪些 浏览:59
欧美爱情电影船戏 浏览:924
拍摄指南小说txt百度下载 浏览:576
大美记者电视剧 浏览:483
男朋友在北京当快递员的电影 浏览:358
电影中有美娜名字的电影叫什么 浏览:833
美剧五十黑2简介 浏览:43
可以在线看的小网址 浏览:139
香港老电影在线免费观看 浏览:362
尸家重地2国语版免费 浏览:162
韩剧 女儿突然带着孙子来找他 浏览:562
2020年情感电影院上映列表 浏览:993
变身小说男变女嫁人 浏览:34
原罪未删减床戏在什么时间 浏览:849
最新全裸韩剧伦理片有哪些 浏览:295