编写Hill密码程序.docx
- 文档编号:3487203
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:9
- 大小:50.12KB
编写Hill密码程序.docx
《编写Hill密码程序.docx》由会员分享,可在线阅读,更多相关《编写Hill密码程序.docx(9页珍藏版)》请在冰豆网上搜索。
编写Hill密码程序
PPT3.5Hill
东南大学《数学实验》报告
学号姓名成绩
实验内容:
编写Hill密码程序
一实验目的
编制通用的Hilln密码程序
二预备知识
(1)熟悉Hilln密码加密过程及实现方法
(2)这次想做个突破于是就用c#,自己完成了矩阵的诸多运算
三实验内容与要求
用C#编制通用的Hilln密码程序(包括加密、解密及破译三个环节)
命令
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
namespaceHill
{
classProgram
{
publicstaticintSeekInverseNumber(inta,intb)
{
inti=1,InverseNumber,k=2;
int[,]SeekArray=newint[100,4];
SeekArray[0,0]=a;
SeekArray[0,1]=1;
SeekArray[0,2]=0;
SeekArray[1,0]=b;
SeekArray[1,1]=0;
SeekArray[1,2]=1;
SeekArray[1,3]=(int)(a/b);
i=2;
while(SeekArray[i,0]!
=1)
{
try
{
SeekArray[i,0]=SeekArray[i-2,0]%SeekArray[i-1,0];
}
catch(DivideByZeroExceptiondze)
{
Console.WriteLine(dze.StackTrace);
}
if(SeekArray[i,0]==0)
{
for(intnotexist=0;notexist<10;notexist++)
Console.WriteLine("所求的逆元不存在");
break;
}
SeekArray[i,1]=SeekArray[i-2,1]-SeekArray[i-1,1]*SeekArray[i-1,3];
SeekArray[i,2]=SeekArray[i-2,2]-SeekArray[i-1,2]*SeekArray[i-1,3];
try
{
SeekArray[i,3]=(int)(SeekArray[i-1,0]/SeekArray[i,0]);
}
catch(DivideByZeroExceptiondze)
{
Console.WriteLine(dze.StackTrace);
}
if(SeekArray[i,0]!
=1)
{
i++;
k++;
}
}
if(SeekArray[k,2]>=0)
{
InverseNumber=SeekArray[k,2];
}
else
{
InverseNumber=SeekArray[k,2]+a;
}
returnInverseNumber;
}
publicstaticvoidswap(inta,intb)
{
inttemp;
temp=a;
a=b;
b=temp;
}
publicstaticvoidHillCipher(int[,]EnArray,char[]EnChar)
{
inti=0,j=0;
intlen=EnChar.Length;
int[]EnIntArray=newint[len];//待加密的数字串,由字符转换而来
int[,]InverseArray=newint[2,2];//逆矩阵
InverseArray=newint[,]{{1,0},{0,1}};
int[]DoEnInt;//加密后的数字串
DoEnInt=newint[EnChar.Length];
char[]DoEnChar;//加密后的字符串
DoEnChar=newchar[EnChar.Length];
int[]DoDeInt;//解密后的数字串
DoDeInt=newint[EnChar.Length];
char[]DoDeChar;//解密后的字符串
DoDeChar=newchar[EnChar.Length];
Console.WriteLine("需要加密的字符串是:
"+newstring(EnChar));
for(i=0;i { EnIntArray[i]=(EnChar[i]+13)%26; } ////////////////////Hill加密/////////////////////////////////////////////////////////////// for(i=0;i { DoEnInt[i]=(EnIntArray[i]*EnArray[0,0]+EnIntArray[i+1]*EnArray[1,0])%26; DoEnInt[i+1]=(EnIntArray[i]*EnArray[0,1]+EnIntArray[i+1]*EnArray[1,1])%26; } for(i=0;i { if(DoEnInt[i]<0) DoEnInt[i]+=26; } for(i=0;i { if(DoEnInt[i]<0) DoEnInt[i]+=26; } for(i=0;i { DoEnChar[i]=Convert.ToChar(DoEnInt[i]+65); } Console.Write("加密后的字符是: "); Console.Write(newstring(DoEnChar)); Console.WriteLine(); if(EnArray[0,0]==0&&EnArray[1,0]==0) { Console.WriteLine("加密矩阵错误! "); } elseif(EnArray[0,0]==0) { swap(EnArray[0,0],EnArray[1,0]); swap(EnArray[0,1],EnArray[1,1]); Console.WriteLine("调整矩阵完成! "); } intm1=SeekInverseNumber(26,EnArray[0,0]); for(i=0;i<2;i++) { EnArray[0,i]=(EnArray[0,i]*m1)%26; InverseArray[0,i]=(InverseArray[0,i]*m1)%26; } intm2=-EnArray[1,0]; for(i=0;i<2;i++) { EnArray[1,i]=EnArray[0,i]*m2+EnArray[1,i]; InverseArray[1,i]=InverseArray[0,i]*m2+InverseArray[1,i]; } intm3=SeekInverseNumber(26,EnArray[1,1]); for(i=0;i<2;i++) { EnArray[1,i]=(EnArray[1,i]*m3)%26; InverseArray[1,i]=(InverseArray[1,i]*m3)%26; } intm4=-EnArray[0,1]; for(i=0;i<2;i++) { EnArray[0,i]=EnArray[1,i]*m4+EnArray[0,i]; InverseArray[0,i]=InverseArray[1,i]*m4+InverseArray[0,i]; } for(i=0;i<2;i++) { for(j=0;j<2;j++) { if(InverseArray[i,j]<0) InverseArray[i,j]+=26; } } for(i=0;i<2;i++) { for(j=0;j<2;j++) { Console.Write(InverseArray[i,j]+""); } Console.WriteLine(); } Console.Write("解密后的字符是: "); /////////////////////////////Hill解密//////////////////////////////////////////////////////// for(i=0;i { DoDeInt[i]=(DoEnInt[i]*InverseArray[0,0]+DoEnInt[i+1]*InverseArray[1,0])%26; DoDeInt[i+1]=(DoEnInt[i]*InverseArray[0,1]+DoEnInt[i+1]*InverseArray[1,1])%26; } for(i=0;i { if(DoDeInt[i]<0) DoDeInt[i]+=26; } for(i=0;i { if(DoDeInt[i]<0) DoDeInt[i]+=26; } for(i=0;i { DoDeChar[i]=Convert.ToChar(DoDeInt[i]+65); } Console.Write(newstring(DoDeChar)); Console.WriteLine(); } staticvoidMain(string[]args) { Console.WriteLine((-162)%26); int[,]EnArray=newint[2,2]; EnArray=newint[,]{{3,6},{2,7}}; stringstr=""; Console.WriteLine(str); char[]EnChar=str.ToUpper().ToCharArray(); HillCipher(EnArray,EnChar); } } } 结果: 心得: 实现这个程序还是有一点困难的,个人感觉比用matlab复杂多了,也花了我不少功夫,但是确实对于Hilln密码体系有了自己的认识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编写 Hill 密码 程序