形式系统

计算机专业教学
posts - 48, comments - 150, trackbacks - 0, articles - 10
  教师博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

07课程设计(题2)

Posted on 2008-06-22 23:58 形式系统 阅读(354) 评论(4)  编辑 收藏 引用 网摘 所属分类: 编程开发

课题2Hill加解密算法

 

Step1:实现单个向量的加密和解密转化

要求:

1、  密钥为二维矩阵,用二维数组表示,且固定。

2、  定义结构体表向量类型。读入一个向量的数据(整数元素),转化成解密向量。

3、  通过编写主程序表达这种变化。

 

以下为参考框架。

#include <stdio.h>

 

/*加密,解密的密钥均已经定好,作为全局变量*/

int enKey[][2]={{11,8},{3,7}};

 

int deKey[][2]={{7,18},{23,11}};

 

/*定义整数向量数据结构*/

typedef struct IntVector{

       int length;

       int vector[10];

}IntVector;

 

IntVector v1,v2,v3;

 

/*加密算法,v1中取出值,运算后写入v2*/

void enclosure() {

    

}

 

/*解密算法,v2中取出值,运算后写入v3*/

void declosure() {

 

}

 

void main(){

 

       v1.length=2;

       v2.length=2;

       v3.length=2;

 

       /*以下输入一个向量的内容到结构体变量*/

    v1.vector[0]=4;

 

       /*加密 */

    enclosure();

 

    /*输出加密后的向量*/

 

 

       /*调用解密过程*/

    declosure();

 

       /*输出解密后的向量*/

}

Feedback

# re: 07课程设计(题2)  回复  更多评论   

2008-06-29 16:39 by 形式系统
本题需要用格式化文件读写方式:即用fscanf
而不是用fread ,那是二进制块方式。

同样,输出用fprintf 而不是用 fwrite.

# re: 07课程设计(题2)  回复  更多评论   

2008-06-29 20:02 by 形式系统
/**
Step 1.采用一个向量作为测试,实现加密和解密算法
*/
#include <stdio.h>
#include <conio.h>


int ek[2][2]={{11,8},{3,7}}; /* (请说明本数组功能) */
int dk[2][2]={{7,18},{23,11}}; /* (请说明本数组功能) */

typedef struct intvector{
int length;
int vector[20];
}intvector; /* (请说明本数组功能) */

intvector v1,v2,v3;

/* 因为最终都是文件输入,
这里重在算法的实现,不用scanf输入
而直接用硬编码的方式赋值。 */
void initData() {
v1.length=2;
v2.length=2;
v3.length=2;
v1.vector[0]=7; /* 设置一个测试向量 */
v1.vector[1]=8;
}

/* (请说明本函数功能) */
void outputVector(char des[],intvector v) {
int i;
printf("\n%s:",des);
for(i=0;i<=1;i++)
printf("%d\t",v.vector[i]);
}

/* (请说明本函数功能) */
void enclosure() {
v2.vector[0]=v1.vector[0]*ek[0][0]+v1.vector[1]*ek[1][0];
v2.vector[1]=v1.vector[0]*ek[0][1]+v1.vector[1]*ek[1][1];

v2.vector[0]=v2.vector[0]%26;
v2.vector[1]=v2.vector[1]%26;
}

/* (请说明本函数功能) */
void declosure() {
v3.vector[0]=v2.vector[0]*dk[0][0]+v2.vector[1]*dk[1][0];
v3.vector[1]=v2.vector[0]*dk[0][1]+v2.vector[1]*dk[1][1];

v3.vector[0]=v3.vector[0]%26;
v3.vector[1]=v3.vector[1]%26;
}

void main() {
initData();
outputVector("明文:",v1);
enclosure();
outputVector("密文:",v2);
declosure();
outputVector("解密后的明文:",v3);
printf("\n");
}

# re: 07课程设计(题2)  回复  更多评论   

2008-06-30 07:17 by 形式系统
/*
Hill加解密,Step 2. 实现真正的字符序列处理
*/

#include <stdio.h>
#include <conio.h>

#define VECLEN 2 /* 向量的长 */
#define BUFLEN 15 /* 缓冲区的长 */

int ek[2][2]={{11,8},{3,7}};
int dk[2][2]={{7,18},{23,11}};

char buf[BUFLEN]; /* 存放明文 */
char buf1[BUFLEN]; /* 存放密文 */
char buf2[BUFLEN]; /* 存放再次解密后的明文 */
int endflag; /* 缓冲区结束标志 */

/* 因为最终都是文件输入,
这里重在算法的实现,不用scanf输入
而直接用硬编码的方式赋值。 */
void initData() {

sprintf(buf,"hilloworld"); /* 设置一个测试用的源串 */
}


void outputVec(int vec[]) {
int i;
for(i=0;i<VECLEN;i++)
printf("%d\t",vec[i]);
}

/* 测试用 */
void outputStr(char des[], char strs[]) {
int i;
printf("%s:%s",des,strs);
}

/* */
void enclosure() {
int i=0,j;
int srcVec[VECLEN]; /* (说明该数组含义) */
int desVec[VECLEN];

while(i<BUFLEN) {
for(j=0;j<VECLEN;j++)
srcVec[j]=buf[i+j]-'a'; /* (说明此句含义) */

/* outputVec(srcVec); */

desVec[0]=srcVec[0]*ek[0][0]+srcVec[1]*ek[1][0];
desVec[1]=srcVec[0]*ek[0][1]+srcVec[1]*ek[1][1];

desVec[0]=desVec[0]%26;
desVec[1]=desVec[1]%26;

for(j=0;j<VECLEN;j++)
buf1[i+j]=(char)(desVec[j])+'a'; /* (说明此句含义) */

/* outputVec(desVec); */
i=i+j;
}
}

/* 解密 */
void declosure() {
/* (实现本算法) */
}
}

void main() {
initData();
outputStr("明文:",buf);
enclosure();
outputStr("密文:",buf1);
declosure();
outputStr("解密后的明文:",buf2);
}

# re: 07课程设计(题2)  回复  更多评论   

2008-06-30 13:57 by 形式系统
/*
Hill加解密
Step 3. 实现从文件中读字符序列且包含所有标准的且可显示的ASCII处理
要求:看懂本程序,在相应部分加上注释。另外,本程序还留有一个错误,希望调试出来。
*/

#include <stdio.h>
#include <conio.h>

#define VECLEN 2 /* 向量的长 */
#define BUFLEN 16 /* 缓冲区的长 */

/* 密钥矩阵是基于模的矩阵,Step1,2中的矩阵不符合要求,需要重构 */
/* 对应的ASCII 字符为32-128的区域 即密码空间大小为96 */
int ek[2][2]={{1,2},{1,3}};
int dk[2][2]={{3,-2},{-1,1}};

char buf[BUFLEN]; /* 存放明文 */
char buf1[BUFLEN]; /* 存放密文 */
char buf2[BUFLEN]; /* 存放再次解密后的明文 */
int endflag; /* 缓冲区结束标志 */

FILE *f,*f1;

/* 因为最终都是文件输入,
这里重在算法的实现,不用scanf输入
而直接用硬编码的方式赋值。 */
void readData() {
int i=0;
while(i<BUFLEN && !feof(f)) {
//printf("%d\n",i);
buf[i]=fgetc(f);
i++;
}
//fscanf(f,"%s",buf); /* 读入向量数据 */
}

/* (说明此函数的功能) */
void writeData() {
int i=0;
while(i<BUFLEN) {
fputc(buf2[i],f);
i++;
}
}

/* (说明此函数的功能) */
void openFile1() {
if((f1=fopen("D:\\t2_s31.txt","w"))==NULL) {
printf("Can't open the file");
exit(1);
}
}
/* 打开输入数据文件文件 */
void openFile() {
if((f=fopen("D:\\t2_s3.txt","r"))==NULL) {
printf("Can't open the file");
exit(1);
}
}
/* 测试用 */
void outputVec(int vec[]) {
int i;
printf("\n");
for(i=0;i<VECLEN;i++)
printf("%d\t",vec[i]);
}
/* 测试用 */
void outputStr(char des[], char strs[]) {
printf("%s:%s",des,strs);
}

/* (说明此函数的功能) */
void enclosure() {
int i=0,j;
int srcVec[VECLEN]; /* (说明该数组含义) */
int desVec[VECLEN];

while(i<BUFLEN) {
for(j=0;j<VECLEN;j++)
srcVec[j]=buf[i+j]; /* (说明此句含义) */

/* outputVec(srcVec); */

desVec[0]=srcVec[0]*ek[0][0]+srcVec[1]*ek[1][0];
desVec[1]=srcVec[0]*ek[0][1]+srcVec[1]*ek[1][1];

desVec[0]=((desVec[0])%128+128)%128; /* 解释此句 */
desVec[1]=((desVec[1])%128+128)%128;

for(j=0;j<VECLEN;j++)
buf1[i+j]=(char)(desVec[j]); /* (说明此句含义) */

//outputVec(desVec);
i=i+j;
}
}

/* (说明此函数的功能) */
void declosure() {
int i=0,j;
int srcVec[VECLEN];
int desVec[VECLEN];

while(i<BUFLEN) {
for(j=0;j<VECLEN;j++)
srcVec[j]=buf1[i+j];

/* outputVec(srcVec); */

desVec[0]=srcVec[0]*dk[0][0]+srcVec[1]*dk[1][0];
desVec[1]=srcVec[0]*dk[0][1]+srcVec[1]*dk[1][1];

desVec[0]=((desVec[0])%128+128)%128;
desVec[1]=((desVec[1])%128+128)%128;

for(j=0;j<VECLEN;j++)
buf2[i+j]=(char)(desVec[j]);

/* outputVec(desVec); */
i=i+j;
}
}

void main() {
openFile();
openFile1();
readData();

outputStr("\n明文:",buf);
enclosure();
outputStr("\n密文:",buf1);
declosure();
outputStr("\n解密后的明文:",buf2);

writeData();
printf("K3");
fclose(f);
printf("\n");
fclose(f1);
}

只有注册用户登录后才能发表评论。