希尔密码实现.docx

上传人:b****1 文档编号:151481 上传时间:2022-10-04 格式:DOCX 页数:11 大小:45.70KB
下载 相关 举报
希尔密码实现.docx_第1页
第1页 / 共11页
希尔密码实现.docx_第2页
第2页 / 共11页
希尔密码实现.docx_第3页
第3页 / 共11页
希尔密码实现.docx_第4页
第4页 / 共11页
希尔密码实现.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

希尔密码实现.docx

《希尔密码实现.docx》由会员分享,可在线阅读,更多相关《希尔密码实现.docx(11页珍藏版)》请在冰豆网上搜索。

希尔密码实现.docx

实验二:

希尔密码(HillCipher)的实现

姓名

班级

学号

实验目的

通过实验,使学生对古典密码学有充分的认识;学会正确使用编程语言(C、Mathematica、Maple等)实现希尔密码,验证课堂中所学的古典密码算法;为学习现代密码算法及其应用奠定基础。

实验内容及要求

1、学生自己随机选取一个5´5矩阵,判断是否可以作为密钥

2、利用所选密钥,对给定的5元明文信息进行加解密

3、对加密得到的密文进行解密,验证结果的正确性

实验结果(可续页)(包括实验代码、实验结果)

使用voidrandom_Matrix()产生随机矩阵

判断产生的矩阵是否在模26的情况下可逆boolInverse(intmatrix[ROW][ROW])

实验代码:

#include

#include

#include

#include

#include

#include

#include

usingnamespacestd;

//常变量的定义

constintM=26;

constintROW=5;

constintCOL=5;

intK[ROW][COL];//加密矩阵

intD[ROW][COL];//解密矩阵

intP[ROW];//明文单元

intC[ROW];//密文单元

intF[ROW];//解密后的单元

//ax+by=d

structGCD{

intx;

inty;

intd;

};

classHill_Cipher{

public:

voidrandom_Matrix();//求行列式

intDet(intmatrix[ROW][ROW],introw);

intgcd(inta,intb);//求最大公约数

boolInverse(intmatrix[ROW][ROW]);

voidmultiphy(intmatrix[ROW][ROW],intp[ROW],introw);//矩阵相乘

voidadjoint_matrix(intmatrix[ROW][ROW],introw);//求伴随矩阵

stringencryption(stringplaintext);

stringdeciphering(stringciphertext);

GCDextended_Euclid(inta,intb);//求模的逆

intinverse(inta,intm);//模逆运算

intMod(inta);

};

voidHill_Cipher:

:

random_Matrix(){

inti,j;

for(i=0;i

{

for(j=0;j

{

K[i][j]=rand()%26;

}

}

cout<<"随机产生5*5的矩阵:

"<

for(i=0;i

{

for(j=0;j

{

printf("%2d",K[i][j]);

}

cout<

}

}

intHill_Cipher:

:

Det(intmatrix[ROW][ROW],introw){

inti,j;

intcofa[ROW][ROW];

intl;

intp=0,q=0;

intsum=0;

if(row==1)

returnmatrix[0][0];

for(i=0;i

{

for(l=0;l

{

if(l

p=0;

else

p=1;

for(j=0;j

{

cofa[l][j]=matrix[l+p][j+1];

}

}

if(i%2==0)

q=1;

else

q=(-1);

sum=sum+matrix[i][0]*q*Det(cofa,row-1);

}

returnsum;

}

intHill_Cipher:

:

gcd(inta,intb){

inttemp;

if(a

{

temp=a;

a=b;

b=temp;

}

while(a%b)

{

temp=b;

b=a%b;

a=temp;

}

returnb;

}

boolHill_Cipher:

:

Inverse(intmatrix[ROW][ROW]){

if(gcd(Det(matrix,ROW),M)==1)

returntrue;

else

returnfalse;

}

voidHill_Cipher:

:

multiphy(intmatrix[ROW][ROW],intp[ROW],introw){

inti,j;

memset(C,0,sizeof(C));

for(i=0;i

{

for(j=0;j

{

C[i]+=P[j]*K[j][i];

}

}

}

stringHill_Cipher:

:

encryption(stringplaintext){

inti;

stringciphertext;

for(i=0;i

{

P[i]=plaintext[i]-'a';

}

multiphy(K,P,ROW);

for(i=0;i

{

C[i]=Mod(C[i]);

ciphertext+=C[i]+'A';

}

returnciphertext;

}

voidHill_Cipher:

:

adjoint_matrix(intmatrix[ROW][ROW],introw){

inti,j,k,l;

intp,q;

p=q=0;

inttemp[ROW][ROW];

for(i=0;i

{

for(j=0;j

{

for(k=0;k

{

if(k

p=0;

else

p=1;

for(l=0;l

{

if(l

q=0;

else

q=1;

temp[k][l]=matrix[k+p][l+q];

}

}

D[j][i]=(int)pow(-1,(double)i+j)*Det(temp,ROW-1);

D[j][i]=Mod(D[j][i]);

}

}

}

stringHill_Cipher:

:

deciphering(stringciphertext){

stringtext;

intdeterminant=Det(K,ROW);

intinver=inverse(determinant,26);

adjoint_matrix(K,ROW);

inti,j;

memset(F,0,sizeof(F));

for(i=0;i

{

for(j=0;j

{

F[i]+=C[j]*D[j][i];

}

F[i]*=inver;

F[i]=Mod(F[i]);

}

for(i=0;i

text+=F[i]+'a';

returntext;

}

GCDHill_Cipher:

:

extended_Euclid(inta,intb){

GCDaa,bb;

if(b==0)

{

aa.x=1;

aa.y=0;

aa.d=a;

returnaa;

}

else

{

bb=extended_Euclid(b,a%b);

aa.x=bb.y;

aa.y=bb.x-(a/b)*bb.y;

aa.d=bb.d;

}

returnaa;

}

intHill_Cipher:

:

inverse(inta,intm){

GCDaa;

aa=extended_Euclid(a,m);

returnaa.x;

}

intHill_Cipher:

:

Mod(inta){

returna>=0?

a%M:

(M+a%M);

}

intmain

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 党团建设

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1