编写Hill密码程序Word下载.docx
《编写Hill密码程序Word下载.docx》由会员分享,可在线阅读,更多相关《编写Hill密码程序Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
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];
SeekArray[i,3]=(int)(SeekArray[i-1,0]/SeekArray[i,0]);
if(SeekArray[i,0]!
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];
需要加密的字符串是:
"
+newstring(EnChar));
for(i=0;
i<
len;
i++)
EnIntArray[i]=(EnChar[i]+13)%26;
////////////////////Hill加密///////////////////////////////////////////////////////////////
len-1;
i+=2)
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;
if(DoEnInt[i]<
0)
DoEnInt[i]+=26;
DoEnChar[i]=Convert.ToChar(DoEnInt[i]+65);
Console.Write("
加密后的字符是:
"
Console.Write(newstring(DoEnChar));
Console.WriteLine();
if(EnArray[0,0]==0&
&
EnArray[1,0]==0)
加密矩阵错误!
elseif(EnArray[0,0]==0)
swap(EnArray[0,0],EnArray[1,0]);
swap(EnArray[0,1],EnArray[1,1]);
调整矩阵完成!
intm1=SeekInverseNumber(26,EnArray[0,0]);
2;
EnArray[0,i]=(EnArray[0,i]*m1)%26;
InverseArray[0,i]=(InverseArray[0,i]*m1)%26;
intm2=-EnArray[1,0];
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]);
EnArray[1,i]=(EnArray[1,i]*m3)%26;
InverseArray[1,i]=(InverseArray[1,i]*m3)%26;
intm4=-EnArray[0,1];
EnArray[0,i]=EnArray[1,i]*m4+EnArray[0,i];
InverseArray[0,i]=InverseArray[1,i]*m4+InverseArray[0,i];
for(j=0;
j<
j++)
if(InverseArray[i,j]<
InverseArray[i,j]+=26;
Console.Write(InverseArray[i,j]+"
解密后的字符是:
/////////////////////////////Hill解密////////////////////////////////////////////////////////
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;
if(DoDeInt[i]<
DoDeInt[i]+=26;
DoDeChar[i]=Convert.ToChar(DoDeInt[i]+65);
Console.Write(newstring(DoDeChar));
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密码体系有了自己的认识。