实验一加密算法.docx
《实验一加密算法.docx》由会员分享,可在线阅读,更多相关《实验一加密算法.docx(21页珍藏版)》请在冰豆网上搜索。
![实验一加密算法.docx](https://file1.bdocx.com/fileroot1/2022-11/17/bd92c0d8-55ea-4278-9b0b-6774d4860823/bd92c0d8-55ea-4278-9b0b-6774d48608231.gif)
实验一加密算法
实验一加密算法
1、实验背景
●多表替代密码:
由多个简单的替代密码构成,例如,可能有5个不同的简单替代密码,分别用于替代明文中不同位置的字符。
主要学习维吉尼亚表。
●换位密码:
一种早期的加密方法,明文的字母保持相同,但顺序被打乱了。
●DES加密算法工作的基本原理:
其入口参数有三个:
key、data、mode。
key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。
当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。
实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。
主要掌握S盒替代。
2、实验目的
1、实验课前复习DES加密、传统加密算法—多表替代(维吉尼亚表替代)、换位密码算法。
2、任选C、C++、VC++等其中一种来实现编程实现加密算法。
3、调试程序,给定一段明文,和密钥,通过加密算法,给出密文。
4、目的:
掌握加密算法的基本原理及其加密方法的详细步骤。
3、实验所需设备
安装Windows9x/2000/XP/2003操作系统和Visualstudio6.0环境的PC。
4、实验拓扑
无
5、实验步骤
●多表替代注意红色字体代码
1启动VC++6.0。
2新建Win32ConsoleApplication。
3在ProjectName和Locate位置填上工程名weijiniya和保存位置(自选)。
4按OK按钮。
选AnsimpleProject。
5按Finish按钮。
6在weijiniya.cpp中添加如下代码:
#include"stdafx.h"
#include
#include
#include
#include
voidShift()/*移位密码*/
{
charc[100];
intlength,i=0,key=0;
//clrscr();
printf("********ShiftCipher********\nPleaseinputprimalsentence:
");
gets(c);
length=strlen(c);
printf("Inputthekey(0~26):
");
scanf("%d",&key);
getchar();
if(key<0)
{
printf("Thevalueofkeyiserror!
\nPressanykeytoreturn...");
getch();
return;
}
for(i=0;i{
if(c[i]>96&&c[i]<123)
c[i]=(c[i]+key-97)%26+65;
elseif(c[i]>64&&c[i]<91)
c[i]=(c[i]+key-65)%26+65;
}
printf("Resultis:
%s\n",c);
for(i=0;i{
if(c[i]>64&&c[i]<91)
c[i]=(c[i]-key-65+26)%26+97;
}
printf("\nAftertranslatedthesentence,wecanseetheprimalsentenceasfollow:
\n%s\n",c);
printf("Pressanykeytoreturn...");
getch();
}
intgcd(inta,intb)/*辗转相除法求a,b的最大公因数*/
{
intk=0;
do
{
k=a%b;
a=b;
b=k;
}while(k!
=0);
returna;
}
intNi(inta,intb)/*求a相对于b的逆*/
{
inti=0;
while(a*(++i)%b!
=1);
returni;
}
voidAffine()/*仿射密码*/
{
charc[100];
intlength,i=0,ka=0,kb=0,tmp;
//clrscr();
printf("********AffineCipher********\nPleaseinputprimalsentence:
");
gets(c);
length=strlen(c);
printf("Inputthekey(2numbers):
");
scanf("%d%d",&ka,&kb);
getchar();
if(gcd(ka,26)!
=1)
{
printf("Thevalueofthekeyiserror!
\nPressanykeytoreturn...");
return;
}
for(i=0;i{
if(c[i]>96&&c[i]<123)
c[i]=(ka*(c[i]-97)+kb)%26+65;
elseif(c[i]>64&&c[i]<91)
c[i]=(ka*(c[i]-65)+kb)%26+65;
}
printf("Resultis:
%s\n",c);
for(i=0;i{
if(c[i]>64&&c[i]<91)
{
tmp=Ni(ka,26)*((c[i]-65)-kb);
if(tmp<0)
c[i]=tmp%26+26+97;
else
c[i]=tmp%26+97;
}
}
printf("\nAftertranslatedthesentence,wecanseetheprimalsentenceasfollow:
\n%s\n",c);
printf("Pressanykeytoreturn...");
getch();
}
voidVigenere()/*维吉利亚密码*/
{
charc[100],key[100];
intlenc,lenk,i=0,j=0,tmp;
//clrscr();
printf("********VigenereCipher********\nPleaseinputprimalsentence:
");
gets(c);
lenc=strlen(c);
strcpy(c,strupr(c));
printf("Inputthekey:
");
gets(key);
lenk=strlen(key);
strcpy(key,strupr(key));
for(;i{
j=j%lenk;
if(c[i]>64&&c[i]<91)
{
c[i]=(c[i]-65+key[j]-65)%26+65;
j++;
}
}
printf("Resultis:
%s\n",c);
for(i=0,j=0;i{
j=j%lenk;
if(c[i]>64&&c[i]<91)
{
tmp=c[i]-65-(key[j]-65);
if(tmp>=0)
c[i]=tmp%26+97;
else
c[i]=(tmp+26)%26+97;
j++;
}
}
printf("\nAftertranslatedthesentence,wecanseetheprimalsentenceasfollow:
\n%s\n",c);
printf("Pressanykeytoreturn...");
getch();
}
voidPermutation()/*置换密码*/
{
charc[100],*q;
int*key,len,m,i,j=0;
//clrscr();
printf("********PermutationCipher********\nPleaseinputprimalsentence:
");
gets(c);
strcpy(c,strupr(c));
len=strlen(c);
for(i=0;i{
if(c[i]<65||c[i]>90)
{
for(j=i;jc[j]=c[j+1];
len--;
}
}
c[len]='\0';
printf("Inputthelengthofthekey:
");
scanf("%d",&m);
//key=(int)new(m*sizeof(int));
//q=(int)new(len*sizeof(int));
printf("Inputthekey:
");
for(i=0;i{
scanf("%d",key+i);
key[i]--;
}
getchar();
for(i=0;i{
j=(i/m)*m;
q[i]=c[*(key+i%m)+j];
}
q[i]='\0';
printf("Resultis:
%s\n",q);
for(i=0,j=0;i{
j=(i/m)*m;
c[*(key+i%m)+j]=q[i]+32;
}
c[len]='\0';
printf("Aftertranslatedthesentence,wecanseetheprimalsentenceasfollow:
\n%s\n",c);
printf("Pressanykeytoreturn...");
free(key);
free(q);
getch();
}
intmain(intargc,char*argv[])
{
chari='0';
//clrscr();
while(i!
='5')
{
//clrscr();
printf("********Press1~5tochoose:
********\n");
printf("1.ShiftCipher\n2.AffineCipher\n3.VigenereCipher\n4.PermutationCipher\n5.Exit\n");
i=getch();
if(i=='1')
Shift();
elseif(i=='2')
Affine();
elseif(i=='3')
Vigenere();
elseif(i=='4')
Permutation();
elseif(i=='5')
break;
}
return0;
}
7按运行按钮,看编译运行结果,如图1-