C语言 文件异或加密

下面的程序我自己写的,不知道是什么地方做错了#include<stdio.h>voidmain(intargc,char*argv[]){FILE*fp1,*fp2;ch... 下面的程序我自己写的,不知道是什么地方做错了
#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);
}
展开
 我来答
风若远去何人留
推荐于2017-10-09 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450135
专业C/C++软件开发

向TA提问 私信TA
展开全部

异或加密是所有加密中最容易实施且代码量相对精简的一种加密方式,其原理为任意数据被同一个值(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;
}

 但是异或加密也是有缺陷的。最大的缺陷是加密操作是二进制层面的,获取到的加密文件大部分将是不可读的乱码。这也是为什么在打开文件的时候要以二进制方式的原因。

鉴于此,在此不便给出测试样例及输入输出,可自行调试。

tattackor
推荐于2017-09-13 · TA获得超过3.5万个赞
知道大有可为答主
回答量:5083
采纳率:94%
帮助的人:901万
展开全部
  1. 什么是异或算法

    异或的特点是原始值经过两次异或某一个数后会变成原来的值,所以有时利用这个特性来进行加密,加密端把数据与一个密钥进行异或操作,生成密文。接收方收到密文后利用加密方提供的密钥进行再次异或操作就能得到明文。

  2. 例程:

    /*以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;
    }
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
28...2@qq.com
2014-06-20
知道答主
回答量:16
采纳率:100%
帮助的人:2.1万
展开全部
这个我不会。

给文件加密,我使用的是超级加密3000.

超级加密3000有超快和最强的文件、文件夹加密功能、数据保护功能,文件夹、文件的粉碎删除以及文件夹伪装等功能。

建议您再加密文件的时候可以试试。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
saladfw
2014-06-16
知道答主
回答量:2
采纳率:0%
帮助的人:2.4万
展开全部
什么情况???
追问
从键盘上读取字符的那个循环无法跳出,就是每输入都会加密,无法进行到下面
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
绝情sPW3
2014-06-16 · TA获得超过172个赞
知道答主
回答量:112
采纳率:0%
帮助的人:158万
展开全部
常见的算法。
#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);
}
是否可以解决您的问题?
请采纳答案,支持我一下。
追问
能别粘贴复制吗,这根本不是我的问题
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式