加解密工具
用C语言做一个加解密工具,怎么做?老师只说让我们做。但是没有给思路,我摸不到头绪,能否给点提示。比如,思路?或用那部分知识做??我现在学的很浅,掌握的C语言的知识还不能灵活使用,麻烦各位,帮助我一下,不用给我完整的代码,但希望能从大家那得到一些提示。谢谢
[解决办法]
去网上找一个加密算法,画个界面,把逻辑加进去就OK了!
[解决办法]
我这里有一个,拿去试试
[code=C/C++][/code]//////////////////////////////////////////////
//此程式旨在进行文件的加密运算
//函数体change(char x)事加密函数,可以根据需求不同进行相应更改
/////////////////////////////////////////////////////
#include<stdio.h>
#include<conio.h>
FILE *fp1;
FILE *fp2;
change(char x)
{
x=x*2;
return x;
}
void main()
{
char a;
if((fp2=fopen("密文.txt","ab"))==NULL)
printf("文件无法创建,请重试!\n\n");
else
{
if((fp1=fopen("明文.txt","rb"))==NULL)
printf("文件无法打开,请重试!\n\n");
else
{
while(fread(&a,sizeof(char),1,fp1)!=0)
{
a=change(a);
fwrite(&a,sizeof(char),1,fp2);
}
fclose(fp1);
}
fclose(fp2);
}
printf("处理完成!按任意键结束\n");
getchar();
}
[code=C/C++][/code]
//////////////////////////////////////////////
//此程式旨在进行文件的解密运算
//函数体change(char x)是解密函数,可以根据加密算法不同进行相应更改
/////////////////////////////////////////////////////
#include<stdio.h>
#include<conio.h>
FILE *fp1;
FILE *fp2;
change(char x)
{
x=x-1;
return x;
}
void main()
{
char a;
if((fp2=fopen("明文.txt","ab"))==NULL)
printf("文件无法创建,请重试!\n\n");
else
{
if((fp1=fopen("密文.txt","rb"))==NULL)
printf("文件无法打开,请重试!\n\n");
else
{
while(fread(&a,sizeof(char),1,fp1)!=0)
{
a=change(a);
fwrite(&a,sizeof(char),1,fp2);
}
fclose(fp1);
}
fclose(fp2);
}
printf("处理完成!按任意键结束\n");
getchar();
}
[解决办法]
#include <stdio.h>
const char base[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
char* base64_encode(const char* data, int data_len);
char *base64_decode(const char* data, int data_len);
static char find_pos(char ch);
int main(int argc, char **argv)
{
char *t = "那个Abcd你好吗,哈哈,ANMOL";
int i = 0;
int j = strlen(t);
char *enc = base64_encode(t, j);
int len = strlen(enc);
char *dec = base64_decode(enc, len);
printf("\noriginal: %s\n", t);
printf("\nencoded : %s\n", enc);
printf("\ndecoded : %s\n", dec);
free(enc);
free(dec);
return 0;
}
/* */
char *base64_encode(const char* data, int data_len)
{
//int data_len = strlen(data);
int prepare = 0;
int ret_len;
int temp = 0;
char *ret = NULL;
char *f = NULL;
int tmp = 0;
char changed[4];
int i = 0;
ret_len = data_len / 3;
temp = data_len % 3;
if (temp > 0)
{
ret_len += 1;
}
ret_len = ret_len*4 + 1;
ret = (char *)malloc(ret_len);
if ( ret == NULL)
{
printf("No enough memory.\n");
exit(0);
}
memset(ret, 0, ret_len);
f = ret;
while (tmp < data_len)
{
temp = 0;
prepare = 0;
memset(changed, '\0', 4);
while (temp < 3)
{
//printf("tmp = %d\n", tmp);
if (tmp >= data_len)
{
break;
}
prepare = ((prepare << 8) | (data[tmp] & 0xFF));
tmp++;
temp++;
}
prepare = (prepare<<((3-temp)*8));
//printf("before for : temp = %d, prepare = %d\n", temp, prepare);
for (i = 0; i < 4 ;i++ )
{
if (temp < i)
{
changed[i] = 0x40;
}
else
{
changed[i] = (prepare>>((3-i)*6)) & 0x3F;
}
*f = base[changed[i]];
//printf("%.2X", changed[i]);
f++;
}
}
*f = '\0';
return ret;
}
/* */
static char find_pos(char ch)
{
char *ptr = (char*)strrchr(base, ch);//the last position (the only) in base[]
return (ptr - base);
}
/* */
char *base64_decode(const char *data, int data_len)
{
int ret_len = (data_len / 4) * 3;
int equal_count = 0;
char *ret = NULL;
char *f = NULL;
int tmp = 0;
int temp = 0;
char need[3];
int prepare = 0;
int i = 0;
if (*(data + data_len - 1) == '=')
{
equal_count += 1;
}
if (*(data + data_len - 2) == '=')
{
equal_count += 1;
}
if (*(data + data_len - 3) == '=')
{//seems impossible
equal_count += 1;
}
switch (equal_count)
{
case 0:
ret_len += 4;//3 + 1 [1 for NULL]
break;
case 1:
ret_len += 4;//Ceil((6*3)/8)+1
break;
case 2:
ret_len += 3;//Ceil((6*2)/8)+1
break;
case 3:
ret_len += 2;//Ceil((6*1)/8)+1
break;
}
ret = (char *)malloc(ret_len);
if (ret == NULL)
{
printf("No enough memory.\n");
exit(0);
}
memset(ret, 0, ret_len);
f = ret;
while (tmp < (data_len - equal_count))
{
temp = 0;
prepare = 0;
memset(need, 0, 4);
while (temp < 4)
{
if (tmp >= (data_len - equal_count))
{
break;
}
prepare = (prepare << 6) | (find_pos(data[tmp]));
temp++;
tmp++;
}
prepare = prepare << ((4-temp) * 6);
for (i=0; i<3 ;i++ )
{
if (i == temp)
{
break;
}
*f = (char)((prepare>>((2-i)*8)) & 0xFF);
f++;
}
}
*f = '\0';
return ret;
}
[解决办法]
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int ec(int ch,int val) //加密算法
{
return ch+val;
}
int dc(int ch,int val) //解密算法
{
return ch-val;
}
int main(int argc,char **argv)
{
FILE *fh,*fh1;
int val=3,ch=0;
char buf[16];
if ( argc!=3)
{
printf("参数出错");
printf("\n\nUsage:\n %sfilename action\n",argv[0]);
exit(0);
}
if ((argv[2][0]=='j')||(argv[2][0]=='J'))
{
fh=fopen(argv[1],"r"); //打开要解密的文件
fh1=fopen(argv[2],"w"); //保存解密后的文件 -- 文件名以J开头
if(fh1==NULL)
{
printf("建立保存解密后文件的文件出错");
exit(0);
}
if (fh<=0)
{
printf("打开要解密的文件出错");
exit(0);
}
while (ch=getc(fh),!feof(fh))
{
ch=dc(ch,val);
fputc(ch,fh1);
putchar(ch);
}
fclose(fh);
fclose (fh1);
printf("解密成功\n");
}
else
{
fh1=fopen(argv[1],"r"); //要加密的文件
fh=fopen(argv[2],"w"); //保存加密后的文件
if(fh1==NULL)
{
printf("打开要加密的文件出错\n");
exit(0);
}
if (fh<=0)
{
printf("建立保存加密后的文件的文件出错\n");
exit(0);
}
while (!feof(fh1))
{
fputc(ec(fgetc(fh1),val),fh);
}
printf("\n\n加密成功\n");
fclose (fh);
fclose (fh1);
}
return 0;
}
[解决办法]
加密解密原理:
其实单纯对文件里的内容进行加密的话,道理还是比较简单的,类似战争中电报中的发送。
举个例子吧,例如我军两队发送密信,内容是,we attack them at 10:00,但是,如果
直接发送的话,若被敌人截取的话,计划不仅会失败,还很可能受到敌人的攻击,这就要对
发送的内容进行加密,比如,我用b代表a,c代表b,d代表c,依次类推,a代表z,1代表0,2代表1, …………,0代表9,这样,加密后发送的内容就是,xf buubdl uifn bu 21:11,这样,即使信息被
敌方截取,没有密文 ,他们也看不懂的,不知道你们老师是不是这个意思,让你们弄个这样的加密解
密程序?若是,其实就简单了,你自己弄一个密文规则,发送前,加密,接受后,根据密文,解密,就
ok了,还不懂的话,加我qq吧,635082021