C语言设计一个简单的加密解密程序

收集20篇左右的某种英文文献资料(每篇字符数量>1万字符),将其编辑成一个超过20万字符的文件,统计每个英文字母的使用频率,对期中的一篇进行加密,然后运用统计方法进行解密,人工比较解密结果与明文的差距。要求:
1. 加密使用简单替换的方法进行,并且只对英文字母进行加密,其他字符不替换,字母替换不区分大小写并按如下方式进行:
a b c d e f g h i j k l m n o p q r s t u v w x y z
g d y e f q r x k a p t u i n o v b j w c s h z l m
即加密时字母a用字母g替换、字母b用字母d替换、字母c用字母y替换、。。。。。。字母z用字母m替换。
2. 设计一个统计字母出现频率的函数void arate(char filename[50],float fr[26]),函数的功能是统计filename文件中每一英文字母出现的频率,统计结果存放在数组fr[26]中,期中a[0]~a[25]分别表示字母a~z(大小写不分)出现的频率。
3. 设计一个加密函数void enp(char infile[50],char outfile[50],char key[26]),函数的功能是将文件infile中的所有字母根据字母表key[26]进行加密,加密结果输出到文件outfile中。
4. 设计一个函数void dep(char infile[50],char outfile[50],float fr[26]),函数的功能是根据字母频率表对文件(密文)中的每一字母进行解密,解密的结果存放到文件outfile中,方法是统计infile文件中每一字母出现的频率,根据频率表推断每一字母(密文)对应的字母(明文)。

C语言设计一个简单的加密解密程序如下:
加密程序代码:
#include<stdio.h>
main()
{
char c,filename[20];
FILE *fp1,*fp2;
printf("请输入待加密的文件名:\n");
scanf("%s",filename);
fp1=fopen(filename,"r");
fp2=fopen("miwen.txt","w");
do
{
c=fgetc(fp1);
if(c>=32&&c<=126)
{
c=c-32;
c=126-c;
}
if(c!=-1)
fprintf(fp2,"%c",c);
}
while(c!=-1);
}
解密程序代码:
#include<stdio.h>
#include<string.h>
main()
{
char c,filename[20];
char yanzhengma[20];
FILE *fp1,*fp2;
printf("请输入待解密文件名:\n");
scanf("%s",filename);
printf("请输入验证码:\n");
scanf("%s",yanzhengma);
if(strcmp(yanzhengma,"shan")==0)
{
fp1=fopen(filename,"r");
fp2=fopen("yuanwen.txt","w");
do
{
c=fgetc(fp1);
if(c>=32&&c<=126)
{
c=126-c;
c=32+c;
}
if(c!=-1)
fprintf(fp2,"%c",c);
}
while(c!=-1);
}
else
{
printf("验证码错误!请重新输入:\n");
scanf("%s",filename);
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-06-19
C++的

// 常量
#define C1 52845
#define C2 22719

CString Encrypt(CString S, WORD Key) // 加密函数
{
CString Result,str;
int i,j;

Result=S; // 初始化结果字符串
for(i=0; i<S.GetLength(); i++) // 依次对字符串中各字符进行操作
{
Result.SetAt(i, S.GetAt(i)^(Key>>8)); // 将密钥移位后与字符异或
Key = ((BYTE)Result.GetAt(i)+Key)*C1+C2; // 产生下一个密钥
}
S=Result; // 保存结果
Result.Empty(); // 清除结果
for(i=0; i<S.GetLength(); i++) // 对加密结果进行转换
{
j=(BYTE)S.GetAt(i); // 提取字符
// 将字符转换为两个字母保存
str="12"; // 设置str长度为2
str.SetAt(0, 65+j/26);
str.SetAt(1, 65+j%26);
Result += str;
}
return Result;
}

CString Decrypt(CString S, WORD Key) // 解密函数
{
CString Result,str;
int i,j;

Result.Empty(); // 清除结果
for(i=0; i < S.GetLength()/2; i++) // 将字符串两个字母一组进行处理
{
j = ((BYTE)S.GetAt(2*i)-65)*26;
j += (BYTE)S.GetAt(2*i+1)-65;
str="1"; // 设置str长度为1
str.SetAt(0, j);
Result+=str; // 追加字符,还原字符串
}
S=Result; // 保存中间结果
for(i=0; i<S.GetLength(); i++) // 依次对字符串中各字符进行操作
{
Result.SetAt(i, (BYTE)S.GetAt(i)^(Key>>8)); // 将密钥移位后与字符异或
Key = ((BYTE)S.GetAt(i)+Key)*C1+C2; // 产生下一个密钥
}
return Result;
}

用法

CString text=_T("192.168.18.14");//需要加密的字符串
WORD key=1314;//key
CString jiami=Encrypt(text,key);//加密
AfxMessageBox(_T("密文:")+jiami);
CString jiemi=Decrypt(jiami,key);//解密
AfxMessageBox(_T("原文:")+jiemi);

参考资料:http://hi.baidu.com/ypxmaomao/blog/item/6361f5d6fb1e8e2606088b32.html

本回答被网友采纳
相似回答