密码实验报告2

时间:2024.3.23

一、实验目的

该实验为验证性实验。

通过本实验,使学生对于两种基本的古典密码编码方法(“代替”与“移位”) 产生深刻的感性认识,体验清楚二者之间的本质差异,为理解和掌握现代密码的相应知识打下良好基础。

二、实验内容

1.  设计一个周期 3 的多表代替密码并予以实现,要求:第 1 个表由密钥字法

    产生(密钥字自拟),第 2 个表由洗牌法产生(注意,字母 a~z 与数字 0~25

    一一对应,洗牌法即相当于实验一的方法  1(n=25)),第三个表由公式法

    产生(数学公式自拟,注意它须是 Z26 上的一个一一变换)。

2.  设计一个周期 5 的 16-置换移位密码并予以实现,要求:5 个 16-置换至少

    有一个是由实验一(n=15)提供的两个方法以外、自行设计的其它方法产

    生。

三、实验要求

1.  上述两个古典密码的编程实现,须能对下面一段明文进行正确加密(对代

    替密码,空格和标点符号保持不动;对移位密码,空格和标点符号也移位):

Q is a symmetric block cipher. It is defined for a block size of 128 bits. It

allows arbitrary length passwords. The design is fairly conservative. It

consists of a simple substitution-permutation network. In this paper we present

the cipher, its design criteria and our analysis. The design is based on both

Rjindael and Serpent. It uses an 8-bit s-box from Rjindael with the linear mixing

layers replaced with two Serpent style bit-slice s-boxes and a linear

permutation. The combination of methods eliminates the high level structure

inherent in Rjindael while having better speed and avalanche characteristics

than Serpent.    Speed is improved over Serpent. This version 2.00 contains

better analysis, editorial changes,  and  an  improved  key  scheduling

algorithm.  The  number  of recommended rounds is also increased.

2.  抓图显示密文(附页),不能出现明显错误。

四、实验步骤

1.通过预习和老师在实验课上的讲解,理解代替密码和移位密码的本质差别,对程序的作用有初步了解;

2.分析实验指导书上所列代码,搞清楚各个子函数的功能、理清程序的大体思路;

3.将主函数与各个子函数进行合并整合,处理编译上出现的语法问题,使编译可以顺利通过;

4.完善程序,输入数据对程序的逻辑功能进行验证,测试随机数结构调用是否完整,测试结果是否符合对应的加密要求,验证打开关闭文件是否顺利。

五、实验体会

六、思考题

“代替表”与“置换”的不动点、逆等是否一致?

答: 不一致。代替是约定明文集合到另一集合的关系,不一定是原来的集合,而移位是在

明文集合中进行随机排列然后得到的密文。两者的不动点、逆等只有在统一集合变换时

才可能一致。

七、实验代码及运行结果

实验代码:

1.  代替密码

#include<stdio.h>

#include<time.h>

#include<string.h>

#include<ctype.h>

#include<stdlib.h>

/*声明子函数*/

unsigned char *full_array2(char n);  /*fully_array函数产生随机数*/

int letter_to_digit(char c);

char digit_to_letter(int n);

unsigned char *KeyGen_s( );

void Encrypt_s(unsigned char *key);

/*主函数*/

int main()

{

    printf("---------代替密码加密算法---------\n");

    Encrypt_s(KeyGen_s());

system("pause");

    return 0;

}

unsigned char *full_array2(char n)  /*fully_array函数产生随机数*/

{

int m,i,j,k,l =0,flag;

static unsigned char P[256];

start:

printf("\n请输入不小于%d的所有随机数个数:\n",n+1);

scanf("%d",&m);

if(m<=n)

{

     printf("\n输入数%d比%d小,须重新输入!\n",m,n+1);

     goto start;

}

srand((unsigned)time(NULL));/*初始化随机种子*/

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

{

     P[l++]=(unsigned char)(rand()%(n+1));

     for(j=0;j<l-1;j++)

     {

         if(P[j]==P[l-1])

         {

             l--;

             break;

         }

     }

}

k=l;

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

{

     flag=0;

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

         if(P[j]==i)

         {

             flag=l;

             break;

         }

     if(!flag)

     {

         P[l]=i;

         l++;

     }

}

return(P);

}

int letter_to_digit(char c)

{

int i;

char alphabet[27]={"abcdefghijklmnopqrstuvwxyz"}; for(i=0;i<26;i++)

if(tolower(c)==alphabet[i]) return(i);

return(-1);

}

char digit_to_letter(int n)

{

char alphabet[27]={"abcdefghijklmnopqrstuvwxyz"};

if(n<0||n>25) return(0);

return(alphabet[n]);

}

unsigned char *KeyGen_s( )

{

char KeyWords[106];

char ChoiceWords[26];

unsigned char *p;

static unsigned char KeyTab[26*3];

int   i,j,k,l;

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

gets(KeyWords);

strcat(KeyWords,"abcdefghijklmnopqrstuvwxyz");

k=0;

l=strlen(KeyWords);

ChoiceWords[k]=tolower(KeyWords[0]);

for(i=1;i<l;i++)

{

if(letter_to_digit(KeyWords[i])==-1) continue; ChoiceWords[++k]=tolower(KeyWords[i]); for(j=0;j<k;j++)

if(ChoiceWords[j]==ChoiceWords[k])

{

k--;

break;

}

}

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

KeyTab[i]=(unsigned char)letter_to_digit(ChoiceWords[i]); p=full_array2(25);

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

KeyTab[26+i]=p[i];

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

KeyTab[52+i]=(unsigned char)((7*i+3)%26);

return(KeyTab);

}

void Encrypt_s(unsigned char *key)

{

int   i;

FILE *fp;

char filename[20],c;

start:

printf("\n 请输入待加密文本文件名:\n");

scanf("%s",filename);

if( (fp=fopen(filename,"rt"))==NULL )

{

printf("没有找到文件:%s\n",filename);

goto start;

}

printf("\n 密文如下:\n");

i=0;

while((c=fgetc(fp))!=EOF)

{

if(letter_to_digit(c)==-1)

{

putchar(c);

continue;

}

 //公式选为 7*i+3(mod 26)

isupper(c)? putchar(toupper(digit_to_letter(key[(int)((i/26)*26+letter_to_digit(c))]))): \

putchar(digit_to_letter(key[(int)((i/26)*26+letter_to_digit(c))]));

 i++;

 if(i>=26*3) i=0;

}

fclose(fp);

}

2.  移位密码

#include<stdio.h>

#include<time.h>

#include<string.h>

#include<ctype.h>

#include<stdlib.h>

/*声明子函数*/

unsigned char *full_array2(char n);

int letter_to_digit(char c) ;

char digit_to_letter(char n) ;

unsigned char *KeyGen_p( ) ;

void Encrypt_p(unsigned char *key) ;

/*主函数*/

int main()

{

    printf("---------移位密码加密算法---------\n");

    Encrypt_p(KeyGen_p());

system("pause");

    return 0;

}

unsigned char *full_array2(char n)  /*fully_array函数产生随机数*/

{

int m,i,j,k,l =0,flag;

static unsigned char P[256];

start:

printf("\n请输入不小于%d的所有随机数个数:(周期为5)\n",n+1);

scanf("%d",&m);

if(m<=n)

{

     printf("\n输入数%d比%d小,须重新输入!\n",m,n+1);

     goto start;

}

srand((unsigned)time(NULL));/*初始化随机种子*/

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

{

     P[l++]=(unsigned char)(rand()%(n+1));

     for(j=0;j<l-1;j++)

     {

         if(P[j]==P[l-1])

         {

             l--;

             break;

         }

     }

}

k=l;

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

{

     flag=0;

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

         if(P[j]==i)

         {

             flag=l;

             break;

         }

     if(!flag)

     {

         P[l]=i;

         l++;

     }

}

return(P);

}

int letter_to_digit(char c) /*将字母转化为数字*/

{

int i;

char alphabet[27]={"abcdefghijklmnopqrstuvwxyz"}; for(i=0;i<26;i++)

if(tolower(c)==alphabet[i]) return(i);

return(-1);

}

char digit_to_letter(char n)/*将数字转化为字母*/

{

char alphabet[27]={"abcdefghijklmnopqrstuvwxyz"};

if(n<0||n>25) return(0);

return(alphabet[n]);

}

unsigned char *KeyGen_p( )/*产生密钥*/

{

unsigned char *p;

static unsigned char KeyTab[16*5];

int   i,j;

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

{

p=full_array2(15);

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

KeyTab[16*i+j]=p[j];

 }

return(KeyTab);

}

void Encrypt_p(unsigned char *key) /*实现明文加密*/

{

int   i,j;

FILE *fp;

char filename[20],c;

char d[16];

start:

printf("\n 请输入待加密文本文件名:\n");

scanf("%s",filename);

if( (fp=fopen(filename,"rt"))==NULL )

{

printf("没有找到文件:%s\n",filename); goto start;

}

printf("\n 密文如下:\n");

i=0;

while((c=fgetc(fp))!=EOF)

{

d[i%16]=c;

i++;

if(i%16!=0) continue;

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

putchar(d[key[(int)(((i-1)/16)*16+j)]]); if(i>=16*5) i=0;

}

if(i%16!=0)

{

for(j=i%16;j<16;j++)d[j]='*';

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

putchar(d[key[(int)((i/16)*16+j)]]);

}

putchar('\n');

fclose(fp);

}

附录:运行结果截图


第二篇:密码学实验报告二


《现代密码学》实验报告

更多相关推荐:
实验报告_密码学

信息安全实验报告学号学生姓名班级实验三密码学实验一古典密码算法实验一实验目的通过编程实现替代密码算法和置换密码算法加深对古典密码体制的了解为深入学习密码学奠定基础二编译环境运行windows或linux操作系统...

实验报告_密码学

密码学与网络安全技术课程上机报告学号119xx4339姓名许海龙班级网112班教师卫琳娜安徽工业大学密码学实验一古典密码算法实验一实验目的通过编程实现替代密码算法和置换密码算法加深对古典密码体制的了解为深入学习...

密码学实验报告

密码学实验报告学院计算机科学与技术班级学号姓名指导老师实验日志实验题目DES或AES分组密码实验目的熟悉分组密码加解密算法的基本原理加深对所提供的部分源程序的理解分组密码将明文分成一组一组在密钥的控制下经过加密...

密码学实验报告

密码学实验报告实验一DES加密算法实验一实验目的理解对称加解密算法的原理和特点理解DES算法的加解密原理二实验背景DES算法为密码体制中的对称密码体制又被称为美国数据加密标准是19xx年美国IBM公司研制的对称...

密码学实验报告

江苏大学学院专业姓名学号计算机学院信息安全09023090604035小组成员AES对称加密算法实现一AES对称加密算法实现原理AESTheAdvancedEncryptionStandard接受一个128位的...

密码学实验报告3

哈尔滨工程大学实验报告实验名称DES加密班级学号姓名实验时间20xx615成绩指导教师实验室名称哈尔滨工程大学实验室与资产管理处制一实验名称MD5加密二实验目的通过编程实现MD5加密的算法设计并加深对其的了解三...

密码学实验报告四

现代密码学实验报告报告创建时间

密码学实验-Feistel网络

实验报告实验五Feistel网络实验目的1熟练掌握Feistel网络结构原理及实现2掌握Feistel网络结构的应用实验内容1写出平衡Feistel网络结构加密运算的算法程序设计在此假定1明文的长度为2mbit...

实验一、密码学基本算法的实现(一)

上机实验报告(一)实验课程:应用密码学实验时间:20XX年9月26日任课教师:***班级:11级信息与计算科学专业1班姓名:刘静**学号:***一、实验名称:密码学基本算法的实现(一)二、实验目的学习常见的古典…

密码学 实验一 古典密码算法 C语言

信息安全实验报告课程名称:_专业:计算机科学与技术_20xx级_02班实验编号:实验项目_指导教师姓名:**学号:***实验成绩:实验一古典密码算法实验名称:古典密码算法实验类型:设计性实验学时:4适用对象:信…

密码学课程设计报告

密码学课程设计班级成员姓名指导教师20xx7中国矿业大学计算机学院密码学课程设计目录密码学课程设计11实验一实现一个多表古典加密和解密程序111实验目的112实验要求113实验内容114古典加密方法115程序代...

密码学课程设计报告

沈阳工程学院课程设计设计题目院系信息学院班级信安本111学生姓名学号指导教师祝世东王素芬职称工程师副教授起止日期20xx年1月6日起至20xx年1月10日止沈阳工程学院课程设计任务书课程设计题目简单的保密通信系...

密码学实验报告(37篇)