📄 ywmm.cpp
字号:
// 041136.cpp : Defines the entry point for the console application.
#include "stdio.h"
#include "iostream.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
#include "time.h"
unsigned char d[80]; // 定义取数据存放空间
unsigned char *full_suiji(int n)
{
static unsigned char p[80]; //定义全排列空间
int i,j;
static unsigned char temp;
for(i=0;i<=n;i++)
p[i]=i; //将数据进行全排列从0到n并对应放入数组P
for(i=n;i>0;i--)
{
j=(d[i-1]+d[i])%i; //对每个排列数据从大到小进行j=di-1+di (mod i)
//计算并与原数据进行交换
temp=p[i];
p[i]=p[j];
p[j]=temp;
}
for(i=0;i<=n;i++)
{printf("%d",p[i]);
printf(" "); } //输出交换后的数据
printf("\n");
return(p);
}
unsigned char *yiwei_5() //用来产生移位置换密码表的子函数
{
char filename[20];
int n=15;
unsigned char *p;
static unsigned char KeyTab5[16*5]; //定义周期为5的16位置换移位密码的存储数组
int i,j;
zailai:
for(i=0;i<5;i++) //生成5组随机数序列
{
start2:
switch(i){ //根据输入选择文件
case 0:{
printf("\n请输入第一个随机全排列数据文本文件名:"); //输入第一个随机全排列数据文本文件名
break; }
case 1:{
printf("\n请输入第二个随机全排列数据文本文件名:"); //输入第二个随机全排列数据文本文件名
break; }
case 2:{
printf("\n请输入第三个随机全排列数据文本文件名:"); //输入第三个随机全排列数据文本文件名
break; }
case 3:{
printf("\n请输入第四个随机全排列数据文本文件名:"); //输入第四个随机全排列数据文本文件名
break; }
case 4:{
printf("\n请输入第五个随机全排列数据文本文件名:"); //输入第五个随机全排列数据文本文件名
break; }
default:{
cout<<"输入有错误!请重新输入"<<endl;
goto zailai;
}
}
FILE *fp;
scanf("%s",filename);
if((fp=fopen(filename,"rt"))==NULL) //以只读方式打开随机全排列的文本文件
{
printf("没有找到文件:%s\n",filename);
goto start2; //如果没有找到文件就返回重新输入
}
fread(d,n + 1,1,fp); //读数据
fclose(fp);
p=full_suiji(n);//调用实验一方法1生成16位随机数序列
for(j=0;j<16;j++)
KeyTab5[16*i+j]=p[j]; //将产生的随机序列存储在KeyTab字符数组中
}
return(KeyTab5);
}
unsigned char *yiwei_5ni(unsigned char *key) //用来产生移位置换密码表逆的子函数
{
static unsigned char KeyTab5ni[16*5]; //定义周期为5的16位置换移位密码逆的存储数组
int m;
for(m = 0; m < 80; m++)
KeyTab5ni[ key[m] + 16 * (int)(m/16) ] = m - 16 * (int)(m/16);//求移位置换密码的逆
return(KeyTab5ni);
}
void jiami_5(unsigned char *key)//用移位置换法加密明文的子函数
{
int i,j;
//定义文件指针,fp用来打开要加密的明文文件,fp1用来创建要保存的密文文件
FILE *fp,*fp1;
//文件名接收字符串的定义
char filename[20],savefile[20],c;
char dd[16]; //每次移位的字符数组
start2:
printf("\n请输入待加密的文本文件名:"); //输入待加密的文本文件名
scanf("%s",filename);
if((fp=fopen(filename,"rt"))==NULL) //以只读方式打开待加密的文本文件
{
printf("没有找到文件:%s\n",filename);
goto start2; //如果没有找到文件就返回重新输入
}
printf("\n请输入密文文本文件名:");
scanf("%s",savefile); //接收保存密文的文件名
if((fp1=fopen(savefile,"wb"))==NULL){ //创建失败则返回
printf("文件创建失败:%s\n",filename);
exit(0);
}
printf("\n密文如下:\n");
i=0; //以下是对需要加密的文件进行加密
while((c=fgetc(fp))!=EOF) //当文件未完时,每次读入一个字符
{
dd[i%16]=c; //将读入的字符存储
i++;
if(i%16!=0) //如不够一组则继续存入
continue;
for(j=0;j<16;j++){
putchar(dd[key[(int)(((i-1)/16)*16+j)]]);
fputc(dd[key[(int)(((i-1)/16)*16+j)]],fp1);
}
//根据周期为5的16_置换移位密码加密输出
if(i>=16*5)
i=0; //一个周期的密钥序列用完后,密钥序列从头开始应用
}
if(i%16!=0)//如最后一组不够十六个时用 不全在进行移位
{
for(j=i%16;j<16;j++)
dd[j]=' ';
//如果文本最后剩余不够16位时,后面的都补' ',直到够16位
for(j=0;j<16;j++){
putchar(dd[key[(int)((i/16)*16+j)]]);
fputc(dd[key[(int)(((i-1)/16)*16+j)]],fp1);//写文件
}
}
cout<<endl;
fclose(fp); //关闭文件
fclose(fp1);
cout<<"密文文件"<<savefile<<"已成功创建"<<endl;
}
void jiemi_5(unsigned char *keyni)//用移位置换法解密密文的子函数
{
int i,j;
//定义文件指针,fp用来打开要解密的密文文件,fp1用来创建要保存的解密后明文文件
FILE *fp,*fp1;
//文件名接收字符串的定义
char filename[20],savefile[20],c;
char dd[16]; //每次移位的字符数组
start3:
printf("\n请输入待解密的文本文件名:"); //输入待解密的文本文件名
scanf("%s",filename);
if((fp=fopen(filename,"rt"))==NULL) //以只读方式打开待解密的文本文件
{
printf("没有找到文件:%s\n",filename);
goto start3; //如果没有找到文件就返回重新输入
}
printf("\n请输入解密后明文文本文件名:");
scanf("%s",savefile); //接收保存解密后明文的文件名
if((fp1=fopen(savefile,"wb"))==NULL){ //创建失败则返回
printf("文件创建失败:%s\n",filename);
exit(0);
}
printf("\n解密后密文如下:\n");
i=0; //以下是对需要解密的文件进行解密
while((c=fgetc(fp))!=EOF) //当文件未完时,每次读入一个字符
{
dd[i%16]=c; //将读入的字符存储
i++;
if(i%16!=0) //如不够一组则继续存入
continue;
for(j=0;j<16;j++){
putchar(dd[keyni[(int)(((i-1)/16)*16+j)]]);
fputc(dd[keyni[(int)(((i-1)/16)*16+j)]],fp1);
}
//根据周期为5的16_置换移位密码解密输出
if(i>=16*5)
i=0; //一个周期的解密密钥序列用完后,解密密钥序列从头开始应用
}
if(i%16!=0)//如最后一组有 时,输出空格
{
for(j=i%16;j<16;j++)
dd[j]=' ';
//如果文本最后剩余*时,后面的都补' ',直到够16位
for(j=0;j<16;j++){
putchar(dd[keyni[(int)((i/16)*16+j)]]);
fputc(dd[keyni[(int)(((i-1)/16)*16+j)]],fp1);//写文件
}
}
cout<<endl;
fclose(fp); //关闭文件
fclose(fp1);
cout<<"解密后明文文件"<<savefile<<"已成功创建"<<endl;
}
//主函数
void main(){
char f;
char e;
begin:
cout<<"周期为5的16-置换移位密码加密。 "<<endl;
unsigned char *Key5;//定义移位表首地址接收字符指针
unsigned char *Key5ni;
Key5=yiwei_5(); //调用移位表生成子函数
jiami_5(Key5); //调用移位置换加密子函数
cout<<endl<<"是否解密?(y/n):"<<endl;
cin>>e;
if(e=='y')
{
Key5ni=yiwei_5ni(Key5);
jiemi_5(Key5ni);
}
cout<<"\n\n\nWelcome to use 移位密码 program.\n Made by __ 041136 年文龙"<<endl;
cout<<" 2008.03.12\n\n"<<endl;
cout<<endl<<"是否继续?(y/n):"<<endl;
cin>>f;
if(f=='y')
goto begin;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -