异或加密是所有加密中最容易实施且代码量相对精简的一种加密方式,其原理为任意数据被同一个值(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
}
但是异或加密也是有缺陷的。最大的缺陷是加密 *** 作是二进制层面的,获取到的加密文件大部分将是不可读的乱码。这也是为什么在打开文件的时候要以二进制方式的原因。
鉴于此,在此不便给出测试样例及输入输出,可自行调试。
#include <stdio.h>#include <stdlib.h>
#include <conio.h>
int main()
{
FILE *p1,*p2
char ch,n
p1=fopen("D:\\源文件.txt","r")
p2=fopen("D:\\目标文件.txt","w")
if(p1==NULL||p2==NULL)
{
printf("文件打开失败\n")
exit(0)
}
printf("请输入密钥,并牢记,解密时要再次输入:")//只要再对加密的文件再进行一次异或运算就得到源文件
n=getch()
printf("*\n")
while(1)
{
ch=fgetc(p1)
if(ch==EOF)
break
ch=ch^n
fputc(ch,p2)
fflush(p2)
}
fclose(p1)
fclose(p2)
return 0
}
批处理不具备位异或加解密功能批处理的执行器cmd.exe不能读取文件二进制数据,在此基础上的加解密工作不能简单实现
可以通过第三方工具而达到目的
例如用C++编写命令行程序
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)