希尔密码实现.docx
《希尔密码实现.docx》由会员分享,可在线阅读,更多相关《希尔密码实现.docx(11页珍藏版)》请在冰豆网上搜索。
![希尔密码实现.docx](https://file1.bdocx.com/fileroot1/2022-10/4/15b75a79-1f09-4b7c-85b5-e603a1c87890/15b75a79-1f09-4b7c-85b5-e603a1c878901.gif)
实验二:
希尔密码(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(lq=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;itext+=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
|
|
|
|
|
|
|
|
|
|
|
|