世界上几大密码是什么 都是怎样破译 (希尔密码加密过程怎么解除)

2023-03-12 17:40:52 密码用途 思思

没有这几大密码这一说 ,因为密码本身的更新度和保密度使得它不为人知!密码本来就是机密度极高的一种科学技术!常人本来无法触及,更谈不上破译。一般接触密码的人群有:间谍、军队机要人员、文字专家(就像《达芬奇密码》里的博士)、电脑编程员(一般在电脑破译密码这个区域)、还有就是原始部族!我觉得你应该说的是传统密码!比如你说的摩尔斯密码!以下是传统密码:Autokey密码

置换密码

二字母组代替密码 (by Charles Wheatstone)

多字母替换密码

希尔密码 摩尔斯密码

维吉尼亚密码

替换密码

凯撒密码

ROT13

仿射密码

Atbash密码

换位密码

Scytale

Grille密码

VIC密码 (一种复杂的手工密码,在五十年代早期被至少一名苏联间谍使用过,在当时是十分安全的)

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

这是C的,且基于的是ASCII码,大致改一改吧。

#includestdio.h

#includemath.h

#includestdlib.h

#includestring.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;i10;i++)

{

for(j=0;j10;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;ia[k].i;i++) for(j=0;ja[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!=0det(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;ians.i;i++)

{

for(j=0;jans.j;j++)

{

ans.s[i][j]=0;

for(k=0;ka.j;k++)

ans.s[i][j]=ans.s[i][j]+a.s[i][k]*b.s[k][j];

}

}

for(i=0;ians.i;i++)

{

for(j=0;jans.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;ians.i;i++)

{

for(j=0;jans.j;j++)

ans.s[i][j]=(((int)pow(-1,i+j)*det(a,i,j)*k)%26+26)%26;

}

for(i=0;ians.i;i++) ans.s[i][ans.j]='\0';

for(i=0;ians.i;i++)

{

for(j=0;ji;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;ia.i;i++) for(j=n;ja.j;j++) a.s[i][j]=a.s[i][j+1];

for(i=m;ia.i;i++) for(j=0;ja.j;j++) a.s[i][j]=a.s[i+1][j];

a.i--;

a.j--;

}

if(a.i==2a.j==2) return(a.s[0][0]*a.s[1][1]-a.s[0][1]*a.s[1][0]);

for(i=0;ia.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;j10;j++) space[j]=-1;

j=0;

for(i=0;ib.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;ib.i;i++)

{

b.s[i][0]-='a';

b.s[i][1]='\0';

}

ans=mul(a[k],b);

for(i=0;ians.i;i++)

{

for(j=0;j10;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;j10;j++) space[j]=-1;

j=0;

for(i=0;ib.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;ib.i;i++)

{

b.s[i][0]-='a';

b.s[i][1]='\0';

}

ans=mul(inv(a[k]),b);

for(i=0;ians.i;i++)

{

for(j=0;j10;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);

}

什么是希尔密码?

希尔密码(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。

随着科技的日新月异和人们对信用卡、计算机的依赖性的加强,密码学显得愈来愈重要。密码学是一门关于加密和解密、密文和明文的学科。若将原本的符号代换成另一种符号,即可称之为广义的密码。狭义的密码主要是为了保密,是一种防止窃文者得知内容而设的另一种符号文字,也是一般人所熟知的密码。

使用信用卡、网络账号及密码、电子信箱、电子签名等都需要密码。为了方便记忆,许多人用生日、电话号码、门牌号码记做密码,但是这样安全性较差。

为了使密码更加复杂,更难解密,产生了许多不同形式的密码。密码的函数特性是明文对密码为一对一或一对多的关系,即明文是密码的函数。传统密码中有一种叫移位法,移位法基本型态是加法加密系统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次,机密的信息就会泄漏出去。

由此看来,日常生活中的密码和传统的密码的可靠性较差,我们有必要寻求一种容易将字母的自然频度隐蔽或均匀化,从而有利于统计分析的安全可靠的加密方法。希尔密码能基本满足这一要求。

不难看出,希尔密码算法中有两个非常重要的条件。第一个条件是字符(信息)与数字对应表,当加密矩阵的阶数n(本文实例中的加密矩阵的阶数n=3)越大,破译的难度就会增大,此时计算量也大,我们可以借助有关数学软件如Mathematica提高运算效率。第二个条件是加密矩阵,如何定义、求解这个矩阵对于密码的加密和破译至关重要。

从破译密码的角度来看,传统的密码有一个致命弱点,就是破译者可从统计出来的字符频率中找到规律,进而找出破译的突破口,尤其是在计算机技术高度发达的今天,破译的速度更快。希尔密码算法则完全克服了这一缺陷,它通过采用线性代数中的矩阵乘法运算和逆运算,能够较好地抵抗频率分析,很难被攻破。

希尔密码体系为破译者至少设置了三道关口,加大了破译难度。破译希尔密码的关键是猜测文字被转换成几维向量(列矩阵的行数)、所对应的字母表是怎样排列的,更为重要的是要设法获取加密矩阵A。要破解密码,向量的维数、字母的排列表和加密矩阵三者缺一不可。古今中外的谍报战中,敌对双方总是千方百计地获取破解对方密码的钥匙,但要想获取希尔密码的三把钥匙谈何容易。

世界上没有攻不破的密码,希尔密码也不例外。希尔密码算法的缺点在于线性变换的安全性很脆弱,易被攻击击破,黑客正是利用各种密码的弱点来向用户频频发起攻击的。尽管如此,希尔密码仍不失为一种简便高效的密码。

希尔密码求解

希尔加密算法的基本思想是,将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”。

利用数学矩阵与希尔密码等知识完成对I like you这句话的加密与解密

比如用矩阵

1 1 0

2 1 1

2 2 1

进行加密

I like you

按列优先排成3行

利用矩阵的乘法

可得加密结果I__U%pyicukk

解密只需求刚才加密矩阵的逆矩阵再相乘即可