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

收集20篇左右的某种英文文献资料(每篇字符数量>1万字符),将其编辑成一个超过20万字符的文件,统计每个英文字母的使用频率,对期中的一篇进行加密,然后运用统计方法进行解密... 收集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文件中每一字母出现的频率,根据频率表推断每一字母(密文)对应的字母(明文)。
展开
 我来答
ningai007
2015-11-09 · TA获得超过1.6万个赞
知道大有可为答主
回答量:1890
采纳率:0%
帮助的人:302万
展开全部
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);
}
}
百度网友58b14a3
2009-06-19 · TA获得超过1588个赞
知道小有建树答主
回答量:593
采纳率:0%
帮助的人:496万
展开全部
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

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式