|
Posted on 2008-06-22 23:58 形式系统 阅读(368) 评论(4) 编辑 收藏 引用 网摘 所属分类: 编程开发
课题2:Hill加解密算法
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);
}
|