信息安全实验一

实验一 加密与解密

一、实验目的

1.提高对加密与解密原理的认识

2.提高对信息隐藏原理的认识

3.学会使用加密与隐藏软件

4.了解口令破解基本方法;

5.体会设置安全口令的重要意义

二、实验要求

使用任意高级语言做出给文本文件加、解密的软件.

三、实验重点、难点

1.Easy code boy plus的使用

2.能熟练运用Lophtcrack、Aoxppr、Apdfprp、Mailhack等

四、实验学时

2学时

五、实验内容

1、凯撒密码实现、维吉尼亚表加密、DES

2、加密与隐藏软件的使用

3、利用破解密码软件破解口令

六、注意事项

Easy code boy plus可以将不同类型的文件作为寄主文件,将各种文件隐藏到不同类型的文件中。为了减少实验时间,实验破解用的密码可以选得简单一些。如1234。

七、实验步骤:

任务一、参考教科书有关内容,掌握凯撒加密方法,自行设计密钥.编制程序。

密码术可以大致别分为两种:即换位和替代,当然也有两者结合的更复杂的方法。在换位中字母不变,位置改变;替代中字母改变,位置不变。

将替代密码用于军事用途的第一个文件记载是恺撒著的《高卢记》。恺撒描述了他如何将密信送到正处在被围困、濒临投降的西塞罗。其中罗马字母被替换成希腊字母使得敌人根本无法看懂信息。苏托尼厄斯在公元二世纪写的《恺撒传》中对恺撒用过的其中一种替代密码作了详细的描写。恺撒只是简单地把信息中的每一个字母用字母表中的该字母后的第三个字母代替。这种密码替换通常叫做凯撒移位密码,或简单的说,凯撒密码。 凯撒密码是将每一个字母向前推移K位。如K=3,则它的每一个明文字符都由其右边第三个(模26)字符代换如将字母A换作字母D,将字母B换作字母E。

如有这样一条指令: RETURN TO ROME

用恺撒密码加密后就成为: UHWXUA WR URPH

如果这份指令被敌方截获,也将不会泄密,因为字面上看不出任何意义。

这种加密方法还可以依据移位的不同产生新的变化,如将每个字母左19位,就产生这样一个明密对照表:

明:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

密:T U V W X Y Z A B C D E F G H I J K L M N O P Q R S

暴力破解: 使用从1-25的密钥依次解密密文,看看得出来的结果是怎样的。

参考资料: 尽管苏托尼厄斯仅提到三个位置的恺撒移位,但显然从1到25个位置的移位我们都可以使用, 因此,为了使密码有更高的安全性,单字母替换密码就出现了。

如: 明码表 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

密码表 Q W E R T Y U I O P A S D F G H J K L Z X C V B N M

明文 F O R E S T 密文 Y G K T L Z

只需重排密码表二十六个字母的顺序,允许密码表是明码表的任意一种重排,密钥就会增加到四千亿亿亿多种,我们就有超过4×1027种密码表。破解就变得很困难。 如何破解包括恺撒密码在内的单字母替换密码?

方法:字母频度分析

尽管我们不知道是谁发现了字母频度的差异可以用于破解密码。但是9世纪的科学家阿尔·金迪在《关于破译加密信息的手稿》对该技术做了最早的描述。“如果我们知道一条加密信息所使用的语言,那么破译这条加密信息的方法就是找出同样的语言写的一篇其他文章,大约一页纸长,然后我们计算其中每个字母的出现频率。我们将频率最高的字母标为1号,频率排第2的标为2号,第三标为3号,依次类推,直到数完样品文章中所有字母。然后我们观察需要破译的密文,同样分类出所有的字母,找出频率最高的字母,并全部用样本文章中最高频率的字母替换。第二高频的字母用样本中2号代替,第三则用3号替换,直到密文中所有字母均已被样本中的字母替换。” 以英文为例,首先我们以一篇或几篇一定长度的普通文章,建立字母表中每个字母的频度表。

在分析密文中的字母频率,将其对照即可破解。虽然设密者后来针对频率分析技术对以前的设密方法做了些改进,比如说引进空符号等,目的是为了打破正常的字母出现频率。但是小的改进已经无法掩盖单字母替换法的巨大缺陷了。到16世纪,最好的密码破译师已经能够破译当时大多数的加密信息。局限性: 短文可能严重偏离标准频率,加入文章少于100个字母,那么对它的解密就会比较困难。

1、开发工具:

DEV

2、代码编制:

凯撒:

\#include <stdio.h>

int main()

{

 char P[100];/*定义明文长度*/

 char C[100];/*定义密文长度*/

 int K=3,i;

 printf("Please input Plaintext:\n"); /*输入明文*/

 gets(P); /* 接受明文*/

 

 for(i=0;P[i]!='\0';i++) {  /*逐个判断字母的大小*/

 if(P[i]>='a'&&P[i]<='z') /*小写字母 */

 C[i]=(P[i]-'a'+K)%26+'a';

 else if(P[i]>='A'&&P[i]<='Z')/*大写字母 */

 C[i]=(P[i]-'A'+K)%26+'A';

 else C[i]=' ';/*如果不是字母,转换为空格*/

 }

 

 printf("The Ciphertext is :\n%s\n",C);/*输出密文*/

// getch();

 return 0;

} 

 

1、程序结构化,用函数分别实现

2、对文件的加密,解密输出到文件

#include<stdio.h>

#include<conio.h>

 

void menu()/*菜单,1.加密 2.解密 3.退出*/

{

//clrscr();

printf("\n===============================================================================");

printf("\n1.Encrypt the file");

printf("\n2.Decrypt the file");

printf("\n3.Quit\n");

printf("===============================================================================\n");

printf("Please select a item:");

return;

}

 

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;

}

 

 

main()

{

int i,n;

char ch0,ch1;

FILE *in,*out;

char infile[10],outfile[10];

 

//textbackground(RED);

//textcolor(LIGHTGREEN);

//clrscr();

 

menu();

ch0=getch();

 

while(ch0!='3')

{

if(ch0=='1')

{

//  clrscr();

  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);/*输入加密密码*/

 

  printf("Please input the outfile:");

  scanf("%s",outfile);/*输入加密后文件的文件名*/

 

  if((out=fopen(outfile,"w"))==NULL)

  {

  printf("Can not open the outfile!\n");

  printf("Press any key to exit!\n");

  fclose(in);

  getch();

//   exit(0);

  }

 

  while(!feof(in))/*加密*/

  {

  fputc(encrypt(fgetc(in),n),out);

  }

 

  printf("\nEncrypt is over!\n");

  fclose(in);

  fclose(out);

//  sleep(1);

}

 

if(ch0=='2')

{

//  clrscr();

​           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);/*输入解密密码(可以为加密时候的密码)*/

 

  n=26-n;

 

  printf("Please input the outfile:");

  scanf("%s",outfile);/*输入解密后文件的文件名*/

 

  if((out=fopen(outfile,"w"))==NULL)

  {

  printf("Can not open the outfile!\n");

  printf("Press any key to exit!\n");

  fclose(in);

  getch();

//   exit(0);

  }

 

  while(!feof(in))

  {

  fputc(encrypt(fgetc(in),n),out);

  }

  printf("\nDecrypt is over!\n");

  fclose(in);

  fclose(out);

//  sleep(1);

}

 

 

//clrscr();

 

//     printf("\nGood Bye!\n");

//sleep(3);

 

 

 

  getch();

}

}
/*移位法:*/

#include <stdio.h>

#include <stdlib.h>

char *Encrypt(char *pwd,int key) /*加密*/

{

	for(int i=0;*(pwd+i)!='\0';i++)

	{

		if(*(pwd+i)>='a'&&*(pwd+i)<='z')

			*(pwd+i)=(*(pwd+i)-'a'+key)%26+'a';

		else if(*(pwd+i)>='A'&&*(pwd+i)<='Z')

			*(pwd+i)=(*(pwd+i)-'A'+key)%26+'A';

	}

	return pwd;

}

 

char *Decrypt(char *pwd,int key) /*解密*/

{

	for(int i=0;*(pwd+i)!='\0';i++)

	{

		if(*(pwd+i)>='a'&&*(pwd+i)<='z')

		{

			if(*(pwd+i)-'a'>=key%26)

				*(pwd+i)=*(pwd+i)-key%26;

			else *(pwd+i)='z'-(key%26-(*(pwd+i)-'a'))-1;

		}

		else if(*(pwd+i)>='A'&&*(pwd+i)<='Z')

		{

			if(*(pwd+i)-'A'>=key%26)

				*(pwd+i)=*(pwd+i)-key%26;

			else *(pwd+i)='Z'-(key%26-(*(pwd+i)-'A'))-1;

		}

	}
	return pwd;

}

 

int main()

{

	char *pwd;

	int key;

	pwd=(char*)malloc(sizeof(char));

	printf("Input your password:");

	gets(pwd);

	printf("Input a key:");

	scanf("%d",&key);

 

	printf("The Ciphertext is:");

	printf("%s\n",Encrypt(pwd,key));

}

 
/*替换法:*/

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

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;

​	int i;

​	int t;

​	for(t=0;*(keyword+t)!='\0';t++);

 

​	for(ch='a';ch<='z';ch++)

​	{

​		for(i=0;*(keyword+i)!=ch;i++)

​		{

​			if(*(keyword+i)=='\0')

​			{

​				*(keyword+t)=ch;

​				t++;

​				break;

​			}

​		}

​	}

​	*(keyword+t)='\0';

}

 

 

char *Ciphertext(char *keyword,char *Plaintext) /*按密码表加密*/

{

​	char ch;

​	int i,j;

​	for(i=0;*(Plaintext+i)!='\0';i++)

​	{

​		for(ch='a',j=0;ch<='z';ch++,j++)

​		{

​			if(*(Plaintext+i)==ch)

​			{

​				*(Plaintext+i)=*(keyword+j);

​				break;

​			}

​		}

​	}

​	return Plaintext;

}

 

char *Decrypt(char *keyword,char *Plaintext) /*解密*/

{

​	char ch;

​	int i,j;

​	for(i=0;*(Plaintext+i)!='\0';i++)

​	{

​		for(ch='a',j=0;*(keyword+j)!='\0';ch++,j++)

​		{

​			if(*(Plaintext+i)==*(keyword+j))

​			{

​				*(Plaintext+i)=ch;

​				break;

​			}

​		}

​	}

​	return Plaintext;

}

 

int main()

{

​	char *keyword,*Plaintext,*tmp=NULL;

​	keyword=(char*)malloc(sizeof(char));

​	Plaintext=(char*)malloc(sizeof(char));

 

​	printf("Input key word:");  /*输入欲用密钥*/

​	gets(keyword);

​	printf("Input Plaintext:"); /*输入要转换的明文*/

​	gets(Plaintext);

 

​	table(keyword);  /*去空格去重复*/

​	newTab(keyword); /*生成密码表*/

 

​	tmp=Ciphertext(keyword,Plaintext); /*对应着密码表生成密文*/

​	puts(tmp); /*输出密文*/

​	puts(Decrypt(keyword,tmp)); /*解密输出*/

}

3、运行效果:

凯撒密码

img

1、程序结构化,用函数分别实现

2、对文件的加密,解密输出到文件

img

img

/移位法:/

img

/替换法:/

img

任务二、加密与隐藏软件的使用

1.加密文件

2.解密文件

3.生成随机密码

4.生成可自解密文件

5.文件隐藏与恢复

6.伪装文件夹


1.加密文件

img

img

img


2.解密文件

img

img


3.生成随机密码

https://suijimimashengcheng.bmcx.com/

img


4.生成可自解密文件

img


5.文件隐藏与恢复

img

img

img


6.伪装文件夹

img

img

任务三、利用破解密码软件破解口令

1.破解Windows7系统密码

2.破解Office文档密码

3.破解PDF文档密码

2.破解Office文档密码

img

3.破解PDF文档密码

http://app.xunjiepdf.com/pdfaddpwd/

img

解密成功

img

八、实验小结(100字左右)

在本次实验中了解熟悉了各种加密算法,对加密算法有了更加深刻的理解,后学习了加密工具,了解了加密工具的使用,学会了伪装文件、机密文件、机密pdf 体会到信息安全的重要性。在今后做项目中,要多加注意信息的加密,本次实验受益匪浅,期待下一次的实验,在课后我也会都加学习了解加密代码,感谢老师。

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验名称: DES算法的编程实现 一、实验概述: DES是美国国家标准技术研究所NIST于1977年制定的分组密码的加密标准,广泛应用于商用数据加密。尽管目前逐渐为AES算法所替代,但作为第一个被公布出来的标准算法,对现代分组密码理论的发展和应用起了奠基性作用,其基本理论和设计思想仍有重要参考价值。DES采用对称分组密码体制,数据块分组长度为64比特,密钥长度是56比特,若输入64比特,则有8个比特用于奇偶校验位。 二、实验目的: 1、 理解分组加密算法的原理和特点 2、 掌握DES算法的加密原理 三、实验原理: DES算法是一种典型的明文块加密标准一一一种将固定长度的明文通过一系列复杂的操作变成同样长度的密文的算法。 对DES而言,块长度为64位。同时,DES使用密钥来自定义变换过程,因此算法认为只有持有加密所用的密钥的用户才能解密密文。密钥表面上是64位的,然而只有其中的56位被实际用于算法,其余8位可以被用于奇偶校验,并在算法中 被丢弃。因此,DES的有效密钥长度为56位,通常称DES的密钥长度为56位。 与其它加密算法相似,DES自身并不是加密的实用手段,而必须以某种工作模式进行实际操作。 DES同时使用了代换和置换两种技巧,整个过程分为两大部分: 1,加密过程; 2,子密钥产生过程。 需要注意的是,DES算法的计算结果与其运作的平台上的编码、所选的加密模式、填充模式等密切相关,所以不同的软件针对同一密文、同一密钥解密出来的结果可能是不一样的,这与计算的正确性无关。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值