C语言 文件异或加密
#include<stdio.h>
void main(int argc,char *argv[])
{
FILE *fp1,*fp2;
char a;
int b=0x6a;
//printf("%d",argc);
if(argc!=3)
{ printf("Using:command Sourcefilename Targetfilename<CR>\n");
return;
}
if((fp1=fopen(argv[1],"w"))==NULL)
{ printf("无法打开\n");
return;
}
if((fp2=fopen(argv[2],"w"))==NULL)
{ printf("无法打开\n");
return;
}
do
{ a=getchar();
fputc(a,fp1);
a=a^b;
putchar(a);
fputc(a,fp2);
}while(a!=EOF);
fclose(fp1);
fclose(fp2);
if((fp2=fopen(argv[2],"r"))==NULL)
{ printf("无法打开\n");
return;
}
do
{ a=fgetc(fp2);
a=a^b;
putchar(a);
}while(a!=EOF);
fclose(fp2);
} 展开
异或加密是所有加密中最容易实施且代码量相对精简的一种加密方式,其原理为任意数据被同一个值(key)两次异或后,值不变。
这种特性,使得异或加密算法的加解密流程是完全相同的,也就是说加解密可以用同一个函数实现。
一、算法思路。
依次读入文件字符,并用key值对其异或,结果输入到目标文件中。
二、算法描述。
1 打开源文件及目标文件。
2 获取密钥值(key)。
3 读入一个字符。
4 对其进行异或计算。
5 结果写入目标文件。
6 重复3-5直到文件结尾。
7 关闭文件。
三、代码实现。
为使代码简洁易懂,输入文件设定为in.txt, 输出文件设定为out.txt, key值设定为0x5C。
假定所有文件及目录可读写。
#include <stdio.h>
#define IN "in.txt"
#define OUT "out.txt"
#define KEY 0x5C
void scrambler(const char *in, const char *out, unsigned char key)
{
FILE *i, *o;
int c;
i = fopen(in, "rb");
o = fopen(out, "wb");//打开文件,因为假定可读写,所以对是否成功不做判断
while((c = fgetc(i))!=EOF)//读入字符直到文件结尾
{
c^=key;//执行异或加密或解密
fputc(c,o);//写入文件
}
fclose(i);
fclose(o);
}
int main()
{
scrambler(IN,OUT,KEY);
return 0;
}
但是异或加密也是有缺陷的。最大的缺陷是加密操作是二进制层面的,获取到的加密文件大部分将是不可读的乱码。这也是为什么在打开文件的时候要以二进制方式的原因。
鉴于此,在此不便给出测试样例及输入输出,可自行调试。
什么是异或算法
异或的特点是原始值经过两次异或某一个数后会变成原来的值,所以有时利用这个特性来进行加密,加密端把数据与一个密钥进行异或操作,生成密文。接收方收到密文后利用加密方提供的密钥进行再次异或操作就能得到明文。
例程:
/*以DWORD为单位对文件进行加密,将每个DWORD与0xfcba0000(密钥)做异或,写入另一个文件*/
#include <stdio.h>
#include <stdlib.h>
#define DWORD unsigned long
#define BYTE unsigned char
#define false 0
#define true 1
int main(int argc, char *argv[])
{
FILE *hSource;
FILE *hDestination;
DWORD dwKey=0xfcba0000;
char* pbBuffer;
DWORD dwBufferLen=sizeof(DWORD);
DWORD dwCount;
DWORD dwData;
if(argv[1]==0||argv[2]==0)
{
printf("missing argument!\n");
return false;
}
char* szSource=argv[1];
char* szDestination=argv[2];
hSource = fopen(szSource,"rb");// 打开源文件.
hDestination = fopen(szDestination,"wb"); //打开目标文件
if (hSource==NULL) {printf("open Source File error !"); return false ;}
if (hDestination==NULL){ printf("open Destination File error !"); return false ;}
//分配缓冲区
pbBuffer=(char* )malloc(dwBufferLen);
do {
// 从源文件中读出dwBlockLen个字节
dwCount = fread(pbBuffer, 1, dwBufferLen, hSource);
//加密数据
dwData = *(DWORD*)pbBuffer; //char* TO dword
dwData^=dwKey; //xor operation
pbBuffer = (char *) &dwData;
// 将加密过的数据写入目标文件
fwrite(pbBuffer, 1, dwCount, hDestination);
} while(!feof(hSource));
//关闭文件、释放内存
fclose(hSource);
fclose(hDestination);
printf("%s is encrypted to %s\n",szSource,szDestination);
return 0;
}
给文件加密,我使用的是超级加密3000.
超级加密3000有超快和最强的文件、文件夹加密功能、数据保护功能,文件夹、文件的粉碎删除以及文件夹伪装等功能。
建议您再加密文件的时候可以试试。
从键盘上读取字符的那个循环无法跳出,就是每输入都会加密,无法进行到下面
#include<stdio.h>
viod main()
{
FILE *in, *out;
char *in_file, *out_file;
char ch;
printf(" input in file name:\n");
gets(in_file);
printf(" input out file name:\n");
gets(out_file);
in = fopen( in_file, "rb"); /*以二进制只读方式打开*/
out = fopen( out_file, "wb");
if( in == NULL || out == NULL ) exit(1);
ch = fgetc(in);
while( ch != -1 ) /*若文件没有结束*/
{
ch = ch^1; /*异或运算*/
fputc( ch, out ); /*将异或结果放入输出文件中*/
ch = fgetc(in);
}
fclose(in);
fclose(out);
}
是否可以解决您的问题?
请采纳答案,支持我一下。
能别粘贴复制吗,这根本不是我的问题