实验一 凯撒加密解密

实验一  凯撒加密解密
实验一  凯撒加密解密

计算机安全基础上机实验报告

学院年级

专业班

学生姓名

学生学号

实验一凯撒加密解密

凯撒密码简介:恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将

明文字母表向左或向右移动一个固定数目的位置。例如,当偏移量是左移3的时候(解密时

的密钥就是3):

明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC

使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。

例如:

明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ

源代码:

#include "kaisa.h"

using namespace std;

void Kaisa::setI()

{

cout << "\n请输入加密密码:";

cin >> i;

}

void Kaisa::jiami()

{

char a, b, c;

cout << "\n请输入明文:\t";

cin >> a;

b = char('z' - i%26);

c = char('Z' - i%26);

cout << "\n密文是:\t";

while(a != '\n')

{

if((a <= 'z' && a >= 'a') || ( a <= 'Z' && a >='A'))

{ if((a <= b && a >= 'a') || ( a <= c && a >='A'))

cout << char(a + i%26);

if(a > c && a <= 'Z')

cout << char(a + i%26 - 26);

if(a > b && a <= 'z')

cout << char(a + i%26 - 26);

if(a == ' ')

cout << " ";

}

else

cout << a;

a = cin.get();

}

cout << endl;

}

void Kaisa::setX()

{

cout << "\n请输入解密密码:";

cin >> i;

}

void Kaisa::jiemi()

{

char a, b, c;

cout << "\n请输入密文:\t";

cin >> a;

b = char('a' + i%26);

c = char('A' + i%26);

cout << "\n明文是:\t";

while(a != '\n')

{

if((a <= 'z' && a >= 'a') || ( a <= 'Z' && a >='A')) { if((a <= 'z' && a >= b) || ( a <= 'Z' && a >= c)) cout << char(a - i%26);

if(a >= 'a' && a < b)

cout << char(a - i%26 + 26);

if(a >= 'A' && a < c)

cout << char(a - i%26 + 26);

if(a == ' ')

cout << " ";

}

else

cout << a;

a = cin.get();

}

cout << endl;

}

int main()

{

while(1)

{

int t;

cout << "1.加密" << endl

<< "2.解密" << endl

<<"按其他键退出"<

<< "选择:";

cin >> t;

Kaisa kaisa;

if(t == 1)

{

kaisa.setI();

kaisa.jiami();

cout<<"加密完成\n"<

}

else if(t == 2)

{

kaisa.setX();

kaisa.jiemi();

cout<<"解密完成\n"<

}

else

return 0;

}

}

测试:密钥:4,明文:abcdefg 实验结果:

实验二DES加密解密

加密原理:DES 使用一个56 位的密钥以及附加的8 位奇偶校验位,产生最大64 位

的分组大小。这是一个迭代的分组密码,使用称为Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用16 个循环,使用异或,置换,代换,移位操作四种基本运算。

源代码:

#include

#include

#include"des_encode.h"

int key[16][48];

char str[8];

void main()

{

EncodeMain();

}

void EncodeMain()

{

int i;

char keychar[8];

int key2[8];

int strkey[8];

printf("请输入8个要加密的字符:\n");

for(i=0;i<8;i++)

scanf("%c",&str[i]);

getchar();

for(i=0;i<8;i++)

strkey[i]=str[i];

printf("\n输入明文的十六进制为:\n");

for(i=0;i<8;i++)

printf("%10x",strkey[i]);

printf("\n请输入密钥(8个字符):\n");

for(i=0;i<8;i++)

scanf("%c",&keychar[i]);

for(i=0;i<8;i++)

key2[i]=keychar[i];

getchar();

Encode(strkey,key2);

printf("\n加密后十六进制密文是:\n");

for(i=0;i<8;i++)

printf("%10x",strkey[i]);

printf("\n\n请输入解密密码\n");

for(i=0;i<8;i++)

scanf("%c",&keychar[i]);

for(i=0;i<8;i++)

key2[i]=keychar[i];

Decode(strkey,key2);

for(i=0;i<8;i++)

printf("%10x",strkey[i]);

for(i=0;i<8;i++)

str[i]=strkey[i];

printf("\n明文为:\t");

for(i=0;i<8;i++)

printf("%c",str[i]);

printf("\n\n");

}

void keyBuild(int *keychar){

int i,j;

int movebit[]={1,1,2,2,2,2,2,2,

1,2,2,2,2,2,2,1};

int midkey2[56];

int midkey[64];

StrtoBin(midkey,keychar);

for(i=0;i<56;i++)

midkey2[i]=midkey[PC1[i]-1];

for(i=0;i<16;i++)

keyCreate(midkey2,movebit[i],i);

}

void StrtoBin(int *midkey,int *keychar){

int trans[8],i,j,k,n;

n=0;

for(i=0;i<8;i++){

j=0;

while(keychar[i]!=0){

trans[j]=keychar[i]%2;

keychar[i]=keychar[i]/2;

j++;

}

for(k=j;k<8;k++)trans[k]=0;

for(k=0;k<8;k++)

midkey[n++]=trans[7-k];

}

}

void keyCreate(int *midkey2,int movebit,int n){ int i,temp[4];

temp[0]=midkey2[0];

temp[1]=midkey2[1];

temp[2]=midkey2[28];

temp[3]=midkey2[29];

if(movebit==2){

for(i=0;i<26;i++){

midkey2[i]=midkey2[i+2];

midkey2[i+28]=midkey2[i+30];

}

midkey2[26]=temp[0];midkey2[27]=temp[1];

midkey2[54]=temp[2];midkey2[55]=temp[3]; }

else

{ for(i=0;i<27;i++){

midkey2[i]=midkey2[i+1];

midkey2[i+28]=midkey2[i+29];

}

midkey2[27]=temp[0];midkey2[55]=temp[2];

}

for(i=0;i<48;i++)

key[n][i]=midkey2[PC2[i]-1];

}

void EncodeData(int *lData,int *rData,int *str){

int i,j,temp[8],lint,rint;

int data[64];

lint=0,rint=0;

for(i=0;i<4;i++){

j=0;

while(str[i]!=0){

temp[j]=str[i]%2;

str[i]=str[i]/2;

j++;

}

while(j<8)temp[j++]=0;

for(j=0;j<8;j++)

lData[lint++]=temp[7-j];

j=0;

while(str[i+4]!=0){

temp[j]=str[i+4]%2;

str[i+4]=str[i+4]/2;

j++;

}

while(j<8)temp[j++]=0;

for(j=0;j<8;j++)rData[rint++]=temp[7-j];

}

for(i=0;i<32;i++){

data[i]=lData[i];

data[i+32]=rData[i];

}

for(i=0;i<32;i++){

lData[i]=data[IP1[i]-1];

rData[i]=data[IP1[i+32]-1];

}

}

void F(int *rData,int *key){

int i,rDataP[48];

Expand(rData,rDataP);

for(i=0;i<48;i++){

rDataP[i]=rDataP[i]^key[i];

}

ExchangeS(rDataP,rData);

ExchangeP(rData);

}

void Expand(int *rData,int *rDataP){

int i;

for(i=0;i<48;i++)

rDataP[i]=rData[Ex[i]-1];

}

void ExchangeS(int *rDataP,int *rData){

int i,n,linex,liney;

linex=liney=0;

for(i=0;i<48;i+=6){

n=i/6;

linex=(rDataP[i]<<1)+rDataP[i+5];

liney=(rDataP[i+1]<<3)+(rDataP[i+2]<<2)+(rDataP[i+3]<<1)+rDataP[i+4];

FillBin(rData,n,s[n][linex][liney]);

}

}

void ExchangeP(int *rData){

int i,temp[32];

for(i=0;i<32;i++)

for(i=0;i<32;i++)

rData[i]=temp[P[i]-1];

}

void FillBin(int *rData,int n,int s){

int temp[4],i;

for(i=0;i<4;i++){

temp[i]=s%2;

s=s/2;

}

for(i=0;i<4;i++)

rData[n*4+i]=temp[3-i];

}

void DecodeData(int *str,int *lData,int *rData){ int i;int a,b;int data[64];

a=0,b=0;

for(i=0;i<32;i++){

data[i]=lData[i];

data[i+32]=rData[i];

}

for(i=0;i<32;i++){

lData[i]=data[IP2[i]-1];

rData[i]=data[IP2[i+32]-1];

}

for(i=0;i<32;i++){

a=(lData[i]&0x1)+(a<<1);

b=(rData[i]&0x1)+(b<<1);

if((i+1)%8==0){

str[i/8]=a;a=0;

str[i/8+4]=b;b=0;

}

}

}

void Encode(int *str,int *keychar){

int lData[32],rData[32],temp[32],rDataP[48];

int i,j;

keyBuild(keychar);

EncodeData(lData,rData,str);

for(i=0;i<16;i++){

for(j=0;j<32;j++)

F(rData,key[i]);

for(j=0;j<32;j++){

rData[j]=rData[j]^lData[j];

}

for(j=0;j<32;j++)

lData[j]=temp[j];

}

DecodeData(str,rData,lData);

}

void Decode(int *str,int *keychar){

int lData[32],rData[32],temp[32],rDataP[48];

int i,j;

keyBuild(keychar);

EncodeData(lData,rData,str);

for(i=0;i<16;i++){

for(j=0;j<32;j++)

temp[j]=rData[j];

F(rData,key[15-i]);

for(j=0;j<32;j++){

rData[j]=rData[j]^lData[j];

}

for(j=0;j<32;j++){

lData[j]=temp[j];

}

}

DecodeData(str,rData,lData);

}

des_encode.h

void EncodeMain();

void DecodeMain();

void Decode(int *str,int *keychar);

void Encode(int *str,int *keychar);

void keyBuild(int *keychar);

void StrtoBin(int *midkey,int *keychar);

void keyCreate(int *midkey2,int movebit,int i); void EncodeData(int *lData,int *rData,int *srt); void F(int *rData,int *key);

void Expand(int *rData,int *rDataP);

void ExchangeS(int *rDataP,int *rData);

void ExchangeP(int *rData);

void FillBin(int *rData,int n,int s);

void DecodeData(int *str,int *lData,int *rData);

int IP1[]={58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,

57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,

61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7, };

int IP2[]={40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,

38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,

36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,

34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 };

int s[][4][16]={{

{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},

{0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},

{4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},

{15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}

},

{

{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},

{3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},

{0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},

{13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}

},

{

{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8},

{13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1},

{13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7},

{1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}

},

{

{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15},

{13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9},

{10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4},

{3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14}

},

{

{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9},

{14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6},

{4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14},

{11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3}

},

{

{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11},

{10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8},

{9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6},

{4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13}

},

{

{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1},

{13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6},

{1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2},

{6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12}

},

{

{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7},

{1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2},

{7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8},

{2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11}

}

};

int Ex[48]={ 32,1,2,3,4,5,

4,5,6,7,8,9,

8,9,10,11,12,13,

12,13,14,15,16,17,

16,17,18,19,20,21,

20,21,22,23,24,25,

24,25,26,27,28,29,

28,29,30,31,32,1

};

int P[32]={16,7,20,21,

29,12,28,17,

1,15,23,26,

5,18,31,10,

2,8,24,14,

32,27,3,9,

19,13,30,6,

22,11,4,25

};

int PC1[56]={57,49,41,33,25,17,9,

1,58,50,42,34,26,18,

10,2,59,51,43,35,27,

19,11,3,60,52,44,36,

63,55,47,39,31,33,15,

7,62,54,46,38,30,22,

14,6,61,53,45,37,29,

21,13,5,28,20,12,4

};

int PC2[48]={14,17,11,24,1,5,

3,28,15,6,21,10,

23,19,12,4,26,8,

16,7,27,20,13,2,

41,52,31,37,47,55,

30,40,51,45,33,48,

44,49,39,56,34,53,

46,42,50,36,29,32

};

测试:明文:qwertyui,密钥:12345678 结果:

实验三RSA加密解密

RSA简介:

公钥和私钥的产生

假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个密钥:

1随意选择两个大的质数p和q,p不等于q,计算N=pq。

2根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)

3选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)

4用以下这个公式计算d:d× e≡ 1 (mod (p-1)(q-1))

5将p和q的记录销毁。

e是公钥,d是私钥。d是秘密的,而N是公众都知道的。Alice将她的公钥传给Bob,而将她的私钥藏起来。

加密消息

假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode 码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。用下面这个公式他可以将n加密为c:

计算c并不复杂。Bob算出c后就可以将它传递给Alice。

解密消息

Alice得到Bob的消息c后就可以利用她的密钥d来解码。她可以用以下这个公式来将c转换为n:

得到n后,她可以将原来的信息m重新复原。

解码的原理是

以及ed≡ 1 (mod p-1)和ed≡ 1 (mod q-1)。费马小定理证明

这说明(因为p和q是不同的质数)

源代码:

#include

#include

#include

int p,q; //选取的两个素数

int n,e,y,d;//============================n=p*q;y为n的欧拉数值;d是e在y下的乘法逆元

int a[160000];//========================存储e的所有值

int c;

int fun=0;

int count=0;

char *asd=new char[];

char *b=new char[] ;//================================存储要加密的字符或字符串

char *z=new char[];

int isPrime(int x)//====================判断是不是素数

{

int i;

for (i = 2; i <= (int)sqrt(x); i++)

{

if (x % i == 0)

break;

}

if (i > (int)sqrt(x))

return true;

return false;

}

int gcd(int f1,int f2)

{

if (f1 == 0)

{

return f2;

}

else

{

return gcd(f2 % f1, f1);

}

}

void keyproduce(int x1,int x2)

{

int m,j=0;

n=x1*x2;

y=(x1-1)*(x2-1);

m=2;

for(m=2;m

{

if(gcd(m,y)==1)

{

j++;

a[j]=m;

}

}

for(;j>0;j--)

cout<

cout<<"e从以上数据中选择"<

cin>>e;

for(int s=1;s

{

double g=0;

int h=0;

g=(n*y+1)/e;

h=(int)g;

if(g==h)

d=h;

}

cout<<"{"<

cout<<"{"<

}

int sum()//=============================求字符串的长度{

int i=0;

while(b[i]!='\0')

i++;

return i;

}

void encode()//==================================加密{

int sum1=sum();

for(count=0;count<=sum1;count++)

{

z[count]=b[count];

if(z[count]==' ')

fun=0;

if(z[count]=='a')

fun=1;

if(z[count]=='b')

fun=2;

if(z[count]=='c')

fun=3;

if(z[count]=='d')

fun=4;

if(z[count]=='e')

fun=5;

if(z[count]=='f')

fun=6;

if(z[count]=='g')

fun=7;

if(z[count]=='h')

fun=8;

if(z[count]=='i')

fun=9;

if(z[count]=='j')

fun=10;

if(z[count]=='k')

fun=11;

if(z[count]=='l')

fun=12;

if(z[count]=='m')

fun=13;

if(z[count]=='n')

fun=14;

if(z[count]=='o')

fun=15;

if(z[count]=='p')

fun=16;

if(z[count]=='q')

fun=17;

if(z[count]=='r')

fun=18;

if(z[count]=='s')

fun=19;

if(z[count]=='t')

fun=20;

if(z[count]=='u')

fun=21;

if(z[count]=='v')

fun=22;

if(z[count]=='w')

fun=23;

if(z[count]=='x')

fun=24;

if(z[count]=='y')

fun=25;

if(z[count]=='z')

c=fun^e%n;

asd[count]=c;

}

count--;

cout<<"以下为加密结果:"<

for(int s=0;s

cout<

cout<

cout<

}

void decode()//=================================解密{

int temp=0;

for(temp=0;temp

{ fun=asd[temp]^d%n;

if(fun==0)

z[temp]=' ';

if(fun==1)

z[temp]='a';

if(fun==2)

z[temp]='b';

if(fun==3)

z[temp]='c';

if(fun==4)

z[temp]='d';

if(fun==5)

z[temp]='e';

if(fun==6)

z[temp]='f';

if(fun==7)

z[temp]='g';

if(fun==8)

z[temp]='h';

if(fun==9)

z[temp]='i';

if(fun==10)

z[temp]='j';

if(fun==11)

z[temp]='k';

if(fun==12)

z[temp]='l';

if(fun==13)

z[temp]='m';

z[temp]='n';

if(fun==15)

z[temp]='o';

if(fun==16)

z[temp]='p';

if(fun==17)

z[temp]='q';

if(fun==18)

z[temp]='r';

if(fun==19)

z[temp]='s';

if(fun==20)

z[temp]='t';

if(fun==21)

z[temp]='u';

if(fun==22)

z[temp]='v';

if(fun==23)

z[temp]='w';

if(fun==24)

z[temp]='x';

if(fun==25)

z[temp]='y';

if(fun==26)

z[temp]='z';

}

temp--;

cout<<"以下为解密结果:"<

for(int s=0;s<=temp;s++)

cout<

}

void main()

{

int num;

next:cout<<"请输入一个大素数(大于5的,小于400的),以便产生公钥与私钥"<

cin>>p;

if(isPrime(p)==0)

{

cout<<"p不是素数"<

goto next;

}

next2:cout<<"请输入一个大素数(大于5的,小于400的),以便产生公钥与私钥"<

cin>>q;

if(isPrime(p)==0)

{

cout<<"p不是素数"<

goto next2;

}

keyproduce(p,q);

cout<<"请输入要加密的字符或字符串"<

cin>>b;

cout<<"加密,输入1"<

cin>>num;

if(num==1)

encode();

cout<<"解密,输入2"<

cin>>num;

if(num==2)

decode();

cout<

cout<<"是否继续验证,是就输入1;否则是输入0"<

cin>>num;

if(num==1)

goto next;

else

return;

}

实验结果:

凯撒密码

南通大学网络安全实验课 实验报告 学生姓名 所在院系 专业 学号 指导教师 南通大学 2014年 5 月

凯撒密码 一、概念与原理 它是一种代换密码。据说恺撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。 凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。由此可见,位数就是凯撒密码加密和解密的密钥。 如恺撒使用过的偏移量为3的这种密码,若明文为: M=Casesar cipher is a shift substitution 则密文为 C=Fdvhvdu flskhu lv d vkliw vxevwlwxwlrq 二、实验内容与步骤 1、手动完成Caesar密码 (1)在实验原理部分我们已经了解了Caesar密码的基本原理,那么我们先写出当密钥k=3时,对应明文:data security has evolved rapidly的密文。 (2)进入实验平台,单击工具栏中的“密码工具”按钮,启动密码工具,在向导区点击“Caesar密码”。在明文输入区输入明文:data security has evolved rapidly。将密钥k调节到3,查看相应的密文,并与你手动加密的密文进行比较。 请根据密钥验证密文与明文对应关系是否正确。 2、Caesar加密 (1)进入“加密解密”|“Caesar密码”视图,在明文输入区输入明文(明文应为英文),单击“加密”按钮进行加密。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值,并记下该密钥k值用于同组主机的解密。加密工作完成后,单击“导出”按钮将密文默认导出到Caesar 共享文件夹(D:\Work\Encryption\Caesar\)中,默认文件名为Caesar密文.txt。 (3)通知同组主机接收密文,并将密钥k通告给同组主机。 (4)单击“导入”按钮,进入同组主机Work\Encryption\Caesar目录(\\同组主机IP\Work\Encryption\Caesar),打开Caesar密文.txt。 (5)调节密钥k的微调按钮或对照表的移位按钮,将k设为同组主机加密时的密钥k 值,这时解密已经成功。 (6)将解密后的明文与同组主机记录的明文比较,请对比明文是否相同。 3、Caesar密码分析 (1)本机进入“密码工具”|“加密解密”|“Caesar密码”,在明文输入区输入明文(要求明文有一定的意义以便让同组主机分析)。 (2)调节密钥k的微调按钮或者对照表的移位按钮,选择合适的密钥k值完成Caesar 加密,单击“导出”按钮,将密文默认导出到Caesar共享文件夹中。 (3)通告同组主机(不要通告密钥值k)密文已经放在共享文件夹中,让同组主机获

文件加密与解密实验报告

HUNAN UNIVERSITY 程序设计训练——文件加密与解密 报告 学生姓名X X X 学生学号20110102308 专业班级建环308 指导老师何英 2012-07-01至 2012-07-13

一、程序设计目的和要求 (3) 二、程序设计内容 (4) 1、总体设计 (4) 1.1主控选择模块 (4) 1.2加密模块 (4) 1.3解密模块 (4) 2、流程图 (5) 三模块详细说明 (6) 四、测试数据及其结果 (7) 五、课程设计总结 (8) 六、附录 (9) 附录1:参考文献 (9) 附录2:程序源代码 (9)

一、程序设计目的和要求 1、目的:为保证个人数据资料不被他人窃取使用,保护个人隐私及个人文件。设计一个基于c语言的文本文件加密及解密软件,可以方便对文本文件的加密与解密。本设计实现了文本文件的解密及解密,运行软件之后只需输入任意一个文本文件的文件名及后缀名即可对该文本文件进行加密或解密操作。本设计的加密与解密系统,使用了面向各类文件的方法,运用Microsoft Visual C++ 6.0实现具有加密、解密、帮助信息、读取文本文件、显示结果、退出等功能的文件加密与解密系统。 2、要求: (1)从键盘输入要进行加密的一行字符串或者需要加密的文件名。 (2)显示菜单: (3)选择菜单,进行相应的操作。加密方法是设置一加密字符串以及对文件的哪些部分进行加密;加密是将原始文件加密并保存到文件中;解密是将加了密的文件还原并保存到文件中,同时应比较与原始文件的一致性; 3、其他要求 (1)变量、函数命名符合规范。 (2)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。

信息安全加密实验报告

重庆交通大学实验报告 班级:计信专业2012级2班 学号: 631206060232 姓名:娄丽梅 实验项目名称:DES加解密程序设计与实现 实验项目性质:设计性(验证性) 实验所属课程:信息安全 实验室(中心):软件实验室 指导教师:米波 实验完成时间: 2014 年12月11日

一、实验目的 1、理解DES加密与解密的程序设计算法思想。 2、编写DES加密与解密程序,实现对明文的加密与解密,加深对数据加密与解密的理解,掌握DES加密算法思想,提高网络安全的编程能力。 二、实验主要内容及原理 (一)实验内容 1、掌握DES算法; 2、编写DES算法。 (二)实验原理 1、初始置换 初始置换在第一轮运算之前执行,对输入分组实施如下表所示的变换。此表应从左向右、从上向下读。在将这64位数据分为左右两部分,每部分分别为32位,将左32位留下,将右32位按照下表进行排列 2、密钥置换 一开始,由于不考虑每个字节的第8位,DES的密钥由64位减至56位。每个字节第8位可作为奇偶校验位以确保密钥不发生错误。接着,56位密钥被分成两部分,每部分28位。然后,根据轮数,这两部分分别循环左移l位或2位。在DES的每一轮中,从56位密钥选出48位子密钥(Sub Key)。 3、S盒置换 当产生了48位密钥后就可以和右边32位明文进行异或运算了,得到48位的密文。 再经过下论的S盒跌带,其功能是把6bit数据变为4bit数据,每个S盒是一个4行、16列的表。盒中的每一项都是一个4位的数。S盒的6个位输入确定了其对应的输出在哪一行哪一列。 4、P盒置换 S盒代替运算后的32位输出依照P盒进行置换。该置换把每输入位映射到输出位,任意一位不能被映射两次,也不能被略去,这个置换叫做直接置换。 5、再次异或运算 最后,将P盒置换的结果与最初的64位分组的左半部分异或,然后左、右半部分交换,接着开始另一轮。 6、当进行到16轮后,最终进行一次末置换,形成密文

凯撒密码实验

一、实验目的 通过实验熟练掌握凯撒密码算法,学会凯撒密码算法程序设计。 二、实验环境 软件工具:Visual C++ 6.0 操作系统:windows xp 三、实验思想 在密码学中存在着各种各样的置换方式,但所有不同的置换方式都包含2 个相同的元素。密钥和协议(算法)。凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换。置换加密的优点就在于它易于实施却难于破解. 发送方和接收方很容易事先商量好一个密钥,然后通过密钥从明文中生成密文,即是敌人若获取密文,通过密文直接猜测其代表的意义,在实践中是不可能的。凯撒密码的加密算法极其简单。其加密过程如下: 在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里不妨假设 k1=k2,记为k)。凯撒密码的加密过程可记为如下一个变换: c≡m+k mod n (其中n为基本字符个数)同样,解密过程可表示为: m≡c+k mod n (其中n为基本字符个数) 四、实验数据(源代码) #include #include #include void table(char *keyword) //筛选密钥(去重复去空格) { int i,j,k; for(i=0;*(keyword+i)!='\0';i++) { for(j=i;*(keyword+j)!='\0';j++) { if(i!=j) if(*(keyword+i)==*(keyword+j)||*(keyword+j)==' ') { for(k=j;*(keyword+k)!='\0';k++) *(keyword+k)=*(keyword+k+1); j--; } } } } void newTab(char *keyword) //生成密钥表 { char ch;

数据加密实验报告

实验报告 课程:计算机保密_ _ 实验名称:数据的加密与解密_ _ 院系(部):计科院_ _ 专业班级:计科11001班_ _ 学号: 201003647_ _ 实验日期: 2013-4-25_ _ 姓名: _刘雄 _ 报告日期: _2013-5-1 _ 报告评分:教师签字:

一. 实验名称 数据加密与解密 二.运行环境 Windows XP系统 IE浏览器 三.实验目的 熟悉加密解密的处理过程,了解基本的加密解密算法。尝试编制基本的加密解密程序。掌握信息认证技术。 四.实验内容及步骤 1、安装运行常用的加解密软件。 2、掌握加解密软件的实际运用。 *3、编写凯撒密码实现、维吉尼亚表加密等置换和替换加解密程序。 4、掌握信息认证的方法及完整性认证。 (1)安装运行常用的加解密软件,掌握加解密软件的实际运用 任务一:通过安装运行加密解密软件(Apocalypso.exe;RSATool.exe;SWriter.exe等(参见:实验一指导))的实际运用,了解并掌握对称密码体系DES、IDEA、AES等算法,及非对称密码体制RSA等算法实施加密加密的原理及技术。 ?DES:加密解密是一种分组加密算法,输入的明文为64位,密钥为56位,生成的密文为64位。 ?BlowFish:算法用来加密64Bit长度的字符串或文件和文件夹加密软件。 ?Gost(Gosudarstvennyi Standard):算法是一种由前苏联设计的类似DES算法的分组密码算法。它是一个64位分组及256位密钥的采用32轮简单迭代型加密算法. ?IDEA:国际数据加密算法:使用128 位密钥提供非常强的安全性; ?Rijndael:是带有可变块长和可变密钥长度的迭代块密码(AES 算法)。块长和密钥长度可以分别指定成128、192 或256 位。 ?MISTY1:它用128位密钥对64位数据进行不确定轮回的加密。文档分为两部分:密钥产生部分和数据随机化部分。 ?Twofish:同Blowfish一样,Twofish使用分组加密机制。它使用任何长度为256比特的单个密钥,对如智能卡的微处理器和嵌入在硬件中运行的软件很有效。它允许使用者调节加密速度,密钥安装时间,和编码大小来平衡性能。 ?Cast-256:AES 算法的一种。 (同学们也可自己下载相应的加解密软件,应用并分析加解密过程) 任务二:下载带MD5验证码的软件(如:https://www.360docs.net/doc/3018682042.html,/downloads/installer/下载(MySQL):Windows (x86, 32-bit), MSI Installer 5.6.11、1.5M;MD5码: 20f788b009a7af437ff4abce8fb3a7d1),使用MD5Verify工具对刚下载的软件生成信息摘要,并与原来的MD5码比较以确定所下载软件的完整性。或用两款不同的MD5软件对同一文件提取信息摘要,而后比较是否一致,由此可进行文件的完整性认证。

信息安全实验要求

一、实习目的 1.熟悉java平台开发环境; 2.理解常见古典加密算法:凯撒密码、多字母替代密码、多表替代密码; 3.理解古典加密技术中的替换技术、置换技术。 二、实习要求 1.实习前认真预习第1、2章相关内容; 2.对实习内容中给定题目上机前先进行程序编写和数据准备; 3.上机编辑、调试、运行程序,并保存最终程序,然后撰写实习报告; 4.实习报告需用专门的报告纸书写,内容包括:实习名称、实习目的、内容、操作过程、程序清单,运行结果,实习中出现的问题及解决方法、实习体会等,具体要求见附录1。 三、实习内容 1.[问题描述] 凯撒密码是把字母表中的每个字母用该字母后的某个字母进行代替。 凯撒密码的通用加密算法是:C=E(P)=(P+k) mod 26 0<26<=""> 凯撒密码的通用解密算法是:P=D(C)=(P-k) mod 26 0<26<=""> 2.[阶梯任务] (1)利用课本表2-1实现凯撒密码的加密、解密算法,能够根据用户选择秘钥(移位数)和明文进行加解密,用户密钥在整数范围内; (2)对于恺撒加密实现图形界面,用户可以输入明文和密钥,在文本框中显示对应密文; (3)实现用户对文件的操作,用户可以通过指定路径文件和密钥,加密结果存储在指定文件中; (4)利用一种已经存在的编码方式,如ASCII,实现任意英文状态字符的加密; (5)学习一种中文编码方式,实现字符集加密和解密。(本项选做)。 3.[实现提示] (1) 用户可以通过命令实现密钥和明文的选择; (2) 由于字母表中共有26个字符,因此,移位前应先将移动的位数(key)和26取模。Java平台中可以实现字符和整数的自动转换,因此将字符加上一个正整数代表在字母表中右移位数。如果移动的位数为负值,则代表在字母中左移位数。

AES加密解密实验报告

信息安全工程课程 实验报告 AES加密解密的实现 课程名称:信息安全工程 学生姓名:黄小菲 学生学号: 3112041006 专业班级:系统工程2038班 任课教师:蔡忠闽 2012年11月22日

目录 1.背景 (1) 1.1 Rijndael密码的设计标准: (1) 1.2 设计思想 (1) 2.系统设计 (2) 2.1系统主要目标 (2) 2.2功能模块与系统结构 (2) 2.2.1字节替换SubByte (2) 2.2.2行移位ShiftRow (2) 2.2.3 列混合MixColumn (3) 2.2.4 轮密钥加AddRoundKey (4) 2.2.5 逆字节替换 (4) 2.2.6逆行移位InvShiftRow (4) 2.2.7 逆列混淆 (4) 3 加密模式 (5) 3.1 电子密码本ECB模式 (5) 3.2加密块链模式CBC模式 (6) 4 系统功能程序设计 (8) 4.1基本加密部分 (8) 4.1.1字节替换 (8) 4.1.2行移位 (8) 4.1.3列混合 (9) 4.1.4轮密钥加 (9) 4.1.5密钥扩展 (10) 4.1.6逆字节替换 (11) 4.1.7逆行移位 (11) 4.1.8逆列混合 (12) 4.1.9加密 (12) 4.1.10解密 (13) 5 实验结果 (14) 5.1 需要加密文件 (14) 5.2 实验加密解密结果 (15) 6 参考资料 (16)

1.背景 AES,密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。AES 有一个固定的128位的块大小和128,192或256位大小的密钥大小。Rijndael算法汇聚了安全性、效率高、易实现性和灵活性等优点,是一种较DES更好的算法。 该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。(Rijdael的发音近于"Rhine doll"。)AES在软体及硬件上都能快速地加解密,相对来说较易于实作,且只需要很少的记忆体。作为一个新的加密标准,目前正被部署应用到更广大的范围. 1.1 Rijndael密码的设计标准: ①抵抗所有已知的攻击。 ②在多个平台上速度快,编码紧凑。 ③设计简单。 当前的大多数分组密码,其轮函数是Feistel结构。 Rijndael没有这种结构。 Rijndael轮函数是由3个不同的可逆均匀变换 1.2 设计思想 ?分组和密钥长度可变,各自可独立指定为128、192、256比特。 ?状态 ?算法中间的结果也需要分组,称之为状态,状态可以用以字节为元素的矩阵 阵列表示,该阵列有4行,列数N b为分组长度除32 ?种子密钥 ?以字节为元素的矩阵阵列描述,阵列为4行,列数N k为密钥长度除32

实验1-1 经典密码——凯撒密码

上机实验报告 一、实验目的: 本次上机实践所涉及并要求掌握的知识点。 1、理解凯撒密码的加密、解密过程 二、实验环境 PC机一台 三、实验内容 实验一移动3位的凯撒密码: 1.(1)用移动3位的凯撒密码加密“keep this secret” (2)用移动3位的凯撒密码加密你的某位老师的名字 2.破译下列谜语的答案。这些答案是用移动3位的凯撒密码来加密的。 (1)谜语:What do you call a sleeping bull?(你怎么称呼一只 睡着的公牛?) 答案: D EXOOGRCHU (2)谜语:What is the different between a teacher and a train? (老师与火车的区别是什么?) 答案:WKH WHDFKHU VDBV “QR JXP DOORZHG” WKH WUDLQ VDBV “FKHZ FKHZ” 实验二移动4位的凯撒密码: 1.请解密下面伊薇写给艾比的便条,她使用的是移动4位的凯撒密码 WSVVC PIX’W YWI GMTLIVW JVSQ RSA SR

2.谜语:What do you call a dog at the beach ?(你怎么称呼一只在海滩 上的狗?) 答案(移动4位密码):E LSX HSK 实验三凯撒密码破解: 1.凯撒密码破解 密文:NGBKGMUUJZOSK 实验四用数传递信息的方法破译以下的谜语: 1.谜语:Where does Thursday come before Wednesday? (哪裡的星期四是比星期三还早的?) 答案: 8,13,19,7,4,3,8,2,19,8,14,13,0,17,24 2.谜语:What always ends everything?(什么总是能终结所有事情?) 答案:19,7,4 11,4,19,19,4,17 ,6 四、实验总结 通过上机实践,对所学内容的某个知识点有了更深入的理解,写出一些体会、 学习心得,甚至是改进意见。 也可以写对界面设计、算法设计、代码编写、程序调试、程序改进等相关的 收获、感悟。 五、附录(源程序清单,包含适当的注释)

信息安全实验-凯撒加密加法乘法变换

【实验目的】 1. 简单加密方法的原理 2. 凯撒密码的原理及程序的编写 【实验设备与环境】 (1)计算机 (2)TC 【实验步骤(内容)】 凯撒密码就是单表代替密码,它的每一个明文字符都由其右边第3个(模26)字符代替(A由D代替,B由E代替,W由Z代替,X由A代替,Y由B代替,Z由C代替)。 (1)加法变换 c≡ (m + k) mod 26 其中m是明文对应的数据,c是与明文对应的密文数据,k是加密用的参数,叫密钥。比如:data security对应数据序列4,1,20,1,19,5,3,21,18,9,20,25,当k=5时,得密文序列9,6,25,6,24,10,8,0,23,14,25,4。 (2)乘同余码: 移位或等间隔抽取码,明密文之间没有一一对应关系。(容易产生多义性)。变换按照同余乘法进行:加密变换:C=P?k (mod 26),解密变换:P=C÷k (mod 26) ,密钥:k 源程序: #include #include char sumjiami(char ch,int n) { n=n%10; while(ch>='A'&&ch<='Z') { return ('A'+(ch-'A'+n)%26);

} while(ch>='a'&&ch<='z') { return ('a'+(ch-'a'+n)%26); } while(ch>='0'&&ch<='9') { return ('0'+(ch-'0'+n)%10); } return ch; } char sumjiemi(char ch,int n) { static int k; k=n%10; while(ch>='A'&&ch<='Z') { n=26-k; return ('A'+(ch-'A'+n)%26); } while(ch>='a'&&ch<='z') { n=26-k; return ('a'+(ch-'a'+n)%26); } while(ch>='0'&&ch<='9') { n=10-k; return ('0'+(ch-'0'+n)%10); } return ch;

加密技术及密码破解实验报告

第九章、实验报告 实验一、设置Windows启动密码 一、实验目的:利用Windows启动密码保存重要文件。 二、实验步骤: 1、在Windows XP系统中选择开始——运行,在打开输入框中“syskey.exe”,点击确定,打开“保证Windows XP账户数据库的安全”对话框。 2、单击【更新】,打开【启动密码】对话框,然后输入密码,在【确认】文本框中再次输入密码,单击【确定】

实验二、为word文档加密解密 一、实验目的:保护数据的安全 二、实验步骤: 1、打开一个需要加密的文档,选择【工具】——【选项】——【安全性】然后输入想要设置打开文件时所需的密码 2、单击【高级(A)】打开加密类型对话框,选中【加密文档属性】复选框,单击【确定】。

3、打开文件的【确认密码】对话框,输入打开文件时需要的密码,单击【确定】,随即打开【确认密码】对话框,输入密码。 4、保存文件后,重新打开Word文档,打开【密码】,输入打开文件所需的密码,单击【确定】输入修改的密码,单击【确定】 破解word密码 (1)安装Advanced Office Password Recovery软件,安装完成后打开需要破解的word 文档,进行暴力破解,结果如图所示: 实验三、使用WinRAR加密解密文件

一.实验目的:加密文件,保证文件的安全性。 二.实验步骤: 1、在需要加密的文件夹上右击,选中【添加到压缩文件】打开【压缩文件名和参数】 2、选中【压缩文件格式】组合框中的【RAR】并在【压缩选项】中选中【压缩后删除源文件】然后切换到【高级】,输入密码,确认密码。 3、关闭对话框,单击确定,压缩完成后,双击压缩文件,系统打开【输入密码对话框】 破解WinRAR加密的文件 (1)安装Advanced RAR Password Recovery软件,打开WinRAR加密文件,进行暴力破解,获得密码。结果如图:

java凯撒密码课程设计论文

攀枝花学院课程设计 题目: 院(系): 年级专业: 姓名: 学号: 指导教师: 二〇XX年XX月XX日 攀枝花学院教务处制

攀枝花学院本科学生课程设计任务书

摘要 计算机与网络技术的发展将人类带入信息化社会,随之而来的是倍受关注的信息安全问题。现代密码学已成为信息安全技术的核心技术。加解密算法,成为重要的信息安全防护技术,正是现代密码学的主要应用研究成果。 其中,凯撒密码作为一种最为古老的对称加密体制,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。凯撒密码加解密是一种典型的对称加密算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。大多数对称算法中,加、解密的密钥是相同的,这些算法也称为秘密密钥算法或单密钥算法。它要求发送者和接收者在安全通信之前,商定一个密钥。在加解密时密钥的保护尤为重要,如果第三方知道就会造成信息失窃,所以,在算法设计时要做详细的分析。此外,文章中还说明了凯撒密码产生的背景,如何完成加解密,并分析了凯撒密码加解密的优缺点。 关键词:凯撒密码,文件加密,防护技术

1前言 1.1背景 由于信息的安全保护问题已经显得十分突出,信息保护的现实需要,使得数据加密算法和技术迅速进入了现代社会,了解并有效使用数据加密算法技术已成为计算机技术和通信领域的专业技术人员和广大用户的迫切需求,这是信息化社会发展阶段的重要标志,数据库加密也是信息安全必不可少的安全手段。而密码则可以有效而且可行的保护信息安全的办法,有效是指密码能够做到使信息不被非法窃取,不被篡改或破坏,可行是说它需要付出的代价是可以接受的。如今数据的加密解密技术已随着计算机技术的迅猛发展,由早期的军事和外交领域,逐步伸展到交通、工业经济、科学技术、社会安全和公共生活的各个领域,成为现代社会中保护信息的重要手段和工具。因此密码学的研究就成为一个重要的来解决信息安全问题的一种手段了,而且有着重要的地位。 在信息时代,信息可以帮助团体或个人,使他们受益,同样,信息也可以用来对他们构成威胁,造成破坏。在竞争激烈的大公司中,工业间谍经常会获取对方的情报。密码技术是保护信息安全的主要手段之一。密码技术世界和数学,计算机科学,电子与通信等诸多学科于一身的交叉学科。他不仅具有信息加密功能,而且具有数字签名,身份验证,秘密分存,系统安全等功能。所以使用密码技术不仅可以保证信息的机密性,而且可以保证信息的完整信和正确性,防止信息被篡改,伪造或假冒。随着我国愈来愈现代化,使用密码的频率会愈来愈多,这就促使了数据加密技术的发展。 1.2开发工具 此次课程设计采用的开发环境是JRE,所选用的开发语言是java。这种开发工具和开发语言都是当今比较流行的。 Eclipse 是一个十分优秀的用于开发Java,,Eclipse的功能非常强大,支持也十分广泛,尤其是对各种开元产品的支持十分不错。Eclipse目前支持Java Servlet,AJAX, JSP, JSF, Struts,Spring, Hibernate,EJB3,JDBC数据库链接工具等多项功能。可以说Eclipse几乎囊括了目前所有主流开元产品的专属eclipse开发工具。

DES加密与解密C实现+实验报告

DES加密与解密算法 课程名称:工程实践 学生姓名: xxxx 学生学号: xxxx 专业班级: xxxx 任课教师: xxxx 论文提交日期: xxxx

DES加密与解密算法 摘要 本世纪五十年代以来,密码学研究领域出现了最具代表性的两大成就。其中之一就是1971年美国学者塔奇曼(Tuchman)和麦耶(Meyer)根据信息论创始人香农(Shannon)提出的“多重加密有效性理论”创立的,后于1977年由美国国家标准局颁布的数据加密标准。 DES密码实际上是Lucifer密码的进一步发展。它是一种采用传统加密方法的区组密码。它的算法是对称的,既可用于加密又可用于解密。 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES枣Data Encryption Standard)。 目前在这里,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。 关键词:DES算法,加密,解密

Abstract This century since fifty time, cryptography research field is the most representative of the two Achievement. One was the 1971 USA scholar Tuchman (Tuchman) and Meyer (Meyer) based on information theory founder Shannon (Shannon) proposed "multiple encryption effectiveness theory" was founded, in 1977 after the National Bureau of standards promulgated by the America data encryption standard.The DES password is actually a further development of the Lucifer password. It is a traditional encryption method of block cipher. The algorithm is symmetric, which can be used for encryption and decryption can be used. In 1977 January, the government promulgated American: adopted IBM design as a non official data confidential data encryption standard (DES - Data Encryption Standard). At present here, along with three gold project especially golden card project startup, DES algorithm in POS, ATM, magnetic card and intelligent card (IC card), gas station, highway toll station and other fields are widely used, so as to realize the security of key data encryption transmission, such as credit card holders PIN, IC card and POS mutual authentication, financial transaction data package of MAC check and so on, are used in DES algorithm. Keywords: DES algorithm, encryption, decryption

古典加密实验报告

古典密码算法 一、实验目的 学习常见的古典密码学算法,通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 二、实验要求 分析替代密码算法和置换密码算法的功能需求,详细设计实现替代密码算法和置换密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。替代密码算法和置换密码算法的实现程序必须提供加密和解密两个接口:int encrypt()和int decrypt()。当加密或者解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR。 三、实验原理 古典密码算法曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。下面介绍两种算法:替代密码和置换密码。 1.替代密码的原理是使用替代法进行加密,就是将明文由其它的字母、数字或符合所代替后形成密文。这里每个明文字母对应的密文字母可能是一个,也可能是多个。接收者对密文进行逆向替换即可得到明文。 2.置换密码算法的原理是不改变明文字符,而是按照某一规则重新排列消息中的比特或字符顺序,才而实现明文信息的加密。置换密码有时又称为换位密码。 我实验过程中替代密码是单表替换,用字母的下一个字母代替:for(j = 0; j < i; j++)

{ if(96 < Mingwen[j]&&Mingwen[j] < 123) { Miwen[j] = 'a' + (Mingwen[j] - 'a' + 1) % 26; } else { Miwen[j] = 'A' + (Mingwen[j] - 'A' + 1) % 26; } } 置换加密主要是对密钥进行整理,还有就是动态分配二维数组,将明文和密文填充置的过程,换密码关键代码如下: for(a = 0; a < k; a++) { for(b = 0; b < hang; b++) { Miwen[i] = p[b][ord[j]]; i++; } j++; } for(a = 0; a < 26; a++) { for(b = 0; b < k; b++) { if(key1[b] == alphatable[a]) { ord[b] = ind++; } } } 具体加密见下图:

凯撒密码的加密和解密

关于凯撒密码的实现原理 班级:姓名:学号:指导老师: 一、设计要求说明 1、设计一个凯撒密码的加密和解密的程序,要求输入一段字符和密码,输出相应的密文,完成加密过程; 若输入被加密的密文及解密密钥,能还原出原文,完成解密。 2、语言不限,工具不限,独立完成,参加答辩。 3、严格按照格式的要求完成文档,在第六部分的运行结果分析中,要求抓图说明。 二、基础知识介绍 凯撒密码的历史 凯撒密码(caeser)是罗马扩张时期朱利斯?凯撒(Julius Caesar)创造的,用于加密通过信使传递的作战命令。它将字母表中的字母移动一定位置而实现加密。 古罗马随笔作家修托尼厄斯在他的作品中披露,凯撒常用一种“密表”给他的朋友写信。这里所说的密表,在密码学上称为“凯撒密表”。用现代的眼光看,凯撒密表是一种相当简单的加密变换,就是把明文中的每一个字母用它在字母表上位置后面的第三个字母代替。古罗马文字就是现在所称的拉丁文,其字母就是我们从英语中熟知的那26个拉丁字母。因此,凯撒密表就是用d代a,用e代b,……,用z代w。这些代替规则也可用一张表格来表示,所以叫“密表”。 基本原理 在密码学中存在着各种各样的置换方式,但所有不同的置换方式都包含2个相同的元素。密钥和协议(算法)。凯撒密码的密钥是3,算法是将普通字母表中的字母用密钥对应的字母替换。置换加密的优点就在于它易于实施却难于破解. 发送方和接收方很容易事先商量好一个密钥,然后通过密钥从明文中生成密文,即是敌人若获取密文,通过密文直接猜测其代表的意义,在实践中是不可能的。 凯撒密码的加密算法极其简单。其加密过程如下: 在这里,我们做此约定:明文记为m,密文记为c,加密变换记为E(k1,m)(其中k1为密钥),解密变换记为D(k2,m)(k2为解密密钥)(在这里k1=k2,不妨记为k)。凯撒密码的加密过程可记为如下一个变换:c≡m+k mod n (其中n为基本字符个数) 同样,解密过程可表示为: m≡c+k mod n (其中n为基本字符个数) 对于计算机而言,n可取256或128,m、k、c均为一个8bit的二进制数。显然,这种加密算法极不安全,即使采用穷举法,最多也只要255次即可破译。当然,究其本身而言,仍然是一个单表置换,因此,频率分析法对其仍是有效的。 加密解密算法 恺撒密码的替换方法是通过排列明文和密文字母表,密文字母表示通过将明文字母表向左或向右移动一个固定数目的位置。例如,当偏移量是左移3的时候(解密时的密钥就是3): 明文字母表:ABCDEFGHIJKLMNOPQRSTUVWXYZ 密文字母表:DEFGHIJKLMNOPQRSTUVWXYZABC 使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。需要解密的人则根据事先已知的密钥反过来操作,得到原来的明文。例如: 明文:THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 密文:WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ 恺撒密码的加密、解密方法还能够通过同余数的数学方法进行计算。首先将字母用数字代替,A=0,B=1,...,Z=25。此时偏移量为n的加密方法即为:

数据结构实验 密码的原理与实现

电气信息学院 实验报告书 课程名称数据结构 实验项目密码的原理与实现 专业班组通信202班 实验时间 2016.12.12 成绩评定 评阅老师 报告撰写人:学号: 电气信息学院专业中心实验室

一、实验内容 利用Visual C++设计合理的凯撒密码,对一段英文段落进行加密处理。以每个人学号的最后两位为key。 英文段落如下: I am Wang Yanling,a student from Sichuan University.Now I major in telecommunication engineering.I am nineteen years old and my family live in Sichuan province.It is the second year of my colleage and I am fighting for my future.I also enjoy playing games,listening to some beautiful music and going out for a date with my friends.How wonderful it is. 二、算法流程图 三、详细设计 源程序: #include #include #include char encrypt(char ch,int n)/*加密函数,把字符向右循环移位n*/

{ while(ch>='A'&&ch<='Z') { return ('A'+(ch-'A'+n)%26); } while(ch>='a'&&ch<='z') { return ('a'+(ch-'a'+n)%26); } return ch; } void menu()/*菜单,1.加密,2.解密,3.退出*/ { printf("\n----------------------"); printf("\n1.Encrypt the file"); printf("\n2.Decrypt the file"); printf("\n3.Quit\n"); printf("------------------------\n"); printf("Please select a item:"); return; } main() { int i,n; char ch0,ch1; FILE *in,*out; char infile[20],outfile[20]; menu(); ch0=getch(); while(ch0!='3') { if(ch0=='1') { printf("\nPlease input the infile:"); scanf("%s",infile);/*输入需要加密的文件名*/ if((in=fopen(infile,"r"))==NULL) { printf("Can not open the infile!\n"); printf("Press any key to exit!\n"); getch(); exit(0); } printf("Please input the key:"); scanf("%d",&n);/*输入加密密码*/

加密解密程序实验报告

程序设计实践 加密解密程序实验报告 课题概述 1.1课题目标和主要内容: 利用MFC类或者win32编写windows程序,实现加密解密的功能。 1.2系统的主要功能: 1.实现用户界面友好的操作。 2.具有对称编码体制,可以实现: i.凯撒密码:能够自定义密钥,自由输入明文,进行加密、解密,在对话框中返回加密和 解密后的内容。

ii.置换密码:能够自定义密钥,自由输入明文,经矩阵变换进行加密、解密,在对话框中返回加密和解密后的内容 iii.对称加密DES:用MFC调用WIN32编写的程序,在用户友好界面操作的同时显示程序加密,解密结果。 3.具有非对称编码体制: i. RSA加密解密:随机产生p,q,经检验是否互质,若不互质接着产生两个随机数,直 到二者互质为止。自动生成p,q,N及加密解密的密钥,可以自由输入明文,返回加密、 解密的内容。 ii. MD5消息摘要计算:用MFC调用WIN32编写的程序,在用户友好界面操作的同时显示程序的加密结果。 4.信息隐藏技术: 用LSB在图片(bmp格式,任意位置的图片)中写入信息,读取信息并显示出来,可 以擦除信息。可以自定义密钥。 5. AES加密解密:用MFC调用WIN32编写的程序,在用户友好界面操作的同时显示程序 加密,解密结果。 6. 以上的所有对文字加密解密的方法(除LSB以外其余所有方法),都可以用于文件加 密,解密,并能够及时保存加密,解密的信息到一个TXT文档,可以存在用户想存放 的地方。 7.更多: 链接了一个可加密解密,功能更为齐全的网站,若是上述方法不能满足用户需求, 可以在程序运行的窗口中点击相应按钮,在联网的条件下进行在线加密解密。 一、系统设计 2.1系统总体框架: 2.2主要的层次逻辑为:

恺撒密码实验报告

实验二恺撒密码 一、实验目的 1. 掌握Java数组的基本操作。 2.掌握String类的生成、访问、修改等基本操作; 3.掌握StringBuffer类的生成、访问、修改等基本操作。 4. 掌握 Pattern和Matcher对象的用法,以及正则表达式的应用 二、实验要求 1.正确地定义数组; 2.正确对数组元素进行赋值、排序。 3.正确使用String类的方法; 4.正确使用StringBuffer类的方法。 5. 正确书写正则表达式和使用Pattern和Matcher对象 三、实验环境 1.计算机一台; 2.JDK、MyEclipse工具软件。 四、实验内容 1.编写Application程序,实现凯撒密码,输入明文自动输出相应的密文。 五、实验步骤 1.处理输入,每次读入一行。 2.将该行转换为字符数组,依次处理每个字符,英文字母转换成相应的密文,其他字符(如标点符号)的密文和明文相同。 3. 整体输出该行的密文。 4. 选作:允许用户扩展凯撒密码,指定字符替换的规则,即可以输入密钥 六、凯撒密码介绍 凯撒密码是一种非常古老的加密方法,相传当年凯撒大地行军打仗时为了保证自己的命令不被敌军知道,就使用这种特殊的方法进行通信,以确保信息传递的安全。他的原理很简单,说到底就是字母于字母之间的替换。下面让我们看一个简单的例子:“baidu”用凯撒密码法加密后字符串变为“edlgx”,它的原理是什么呢?把“baidu”中的每一个字母按字母表顺序向后移3位,所得的结果就是刚才我们所看到的密文。 七、实验结果 源代码为: package youximima; import java.util.*; public class Mima {

相关文档
最新文档