📄 vigenere_cpp
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0051)http://210.40.7.141/study/cryptology/1/vigenere.cpp -->
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META content="MSHTML 6.00.2900.3020" name=GENERATOR></HEAD>
<BODY><PRE>//c语言实现古典加密算法Vigenere算法
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
#define SHIFT 10;//除英文字符外其他字符的ASCII码移位数
//函数声明
void init(char * filename,char *o_filename,char * key,int *text_len,int *key_len,int *select);//初始化
void encrypt(char *filename,char *result,char *key,int text_len,int key_len);//加密函数
void decrypt(char *filename,char *result,char *key,int text_len,int key_len);//解密函数
void output(char *result,char *o_filename,int text_len);//输出结果到文件
void main()
{ while(1){
char filename[50]="";//存放文本文件名
char o_filename[50]="";//存放输出文件名
char key[50]="";//存放密钥
int text_len=0;//文件内容的长度
int key_len=0;//密钥的长度
int select=1;
init(filename,o_filename,key,&text_len,&key_len,&select);
char *result=new char[text_len];
if(select==1)
encrypt(filename,result,key,text_len,key_len);
else
decrypt(filename,result,key,text_len,key_len);
output(result,o_filename,text_len);
}
}
void init(char *filename,char *o_filename,char *key,int *text_len,int *key_len,int *select)
{
system("cls");//清屏
printf("\n\n\n\t\t Vigenere加解密算法的C语言实现!作者:郭志勇");
printf("\n\n\n\t\t\t选择您要进行的操作");
printf("\n\n\n\t\t\t1-加密 2-解密 3-退出\n");
scanf("%d",select);
if(*select==3)exit(0);
printf("请输入需要%s的文件名:\n",(*select==1?"加密":"解密"));
scanf("%s",filename);
printf("请输入结果输出文件名:\n");
scanf("%s",o_filename);
printf("请输入密钥:\n");
scanf("%s",key);
*key_len=strlen(key);
for(int i=0;i<(*key_len);i++)
{
if(key[i]>='A'&&key[i]<='Z')//如果key某位字符为大写,转换成小写
key[i]+=32;
}
FILE *fp;
if ((fp = fopen(filename, "r"))==NULL)//打开文件
printf("打开文件错误");
else{
while(!feof(fp))//计算文本长度
{
fgetc(fp);
(*text_len)++;
}
(*text_len)--;
fclose(fp);
}
}
//加密函数
void encrypt(char *filename,char *result,char *key,int text_len,int key_len)
{
char c;
FILE *fp;
if ((fp = fopen(filename, "r"))==NULL)//打开文件
printf("打开文件错误");
else
{
int k=0;
int step=(text_len%key_len==0)?(text_len/key_len):(text_len/key_len+1);
rewind(fp);
for(int i=0;i<step;i++)
{
for(int j=0;j<key_len&&!feof(fp);j++,k++)
{
c=fgetc(fp);
if(c>='A'&&c<='Z'){
result[k]=((c-65)+(key[j]-97))%26+65+32;//加减32的目的是变换大小写
}
else if(c>='a'&&c<='z')
result[k]=((c-97)+(key[j]-97))%26+97-32;
else
result[k]=c+SHIFT;
}
}
fclose(fp);
}
}
//解密函数
void decrypt(char *filename,char * result,char *key,int text_len,int key_len)
{ char c;
FILE *fp;
if ((fp = fopen(filename, "r"))==NULL)//打开文件
printf("打开文件错误");
else
{
int k=0;
int step=(text_len%key_len==0)?(text_len/key_len):(text_len/key_len+1);
rewind(fp);
for(int i=0;i<step;i++)
{
for(int j=0;j<key_len&&!feof(fp);j++,k++)
{
c=fgetc(fp);
if(c>='A'&&c<='Z'){
for(result[k]='Z';result[k]>='A';result[k]--)
if((((result[k]-65)+(key[j]-97))%26+65)==c){
result[k]+=32;//变换大小写
break;
}
}
else if(c>='a'&&c<='z'){
for(result[k]='z';result[k]>='a';result[k]--)
if((((result[k]-97)+(key[j]-97))%26+97)==c)
{
result[k]-=32;//变换大小写
break;
}
}
else
result[k]=c-SHIFT;
}
}
fclose(fp);
}
}
//输出结果到文件
void output(char *result,char *o_filename,int text_len)
{
FILE *fp;
if ((fp = fopen(o_filename, "w"))==NULL)//打开文件
printf("打开文件错误");
else
{
for(int i=0;i<text_len;i++)
fputc(result[i],fp);
fclose(fp);
}
}
</PRE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -