加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C语言利用“异或”实现的简单数字加密

(2014-10-16 21:32:09)
标签:

it

分类: 程序设计

   

C语言中,“异或”是一种位运算,可以表示为“a ^ b”。如果ab两个操作数的对应位相同,则运算结果的对应位为“0”;否则运算结果的对应位为“1”。例如,以下代码段

char a=0x86;                              // a= 10000110B

char b=0x35;                              // b= 00110101B

char c=a ^ b;                              // c= 10110011B

运算结果为c=0xb3

有趣的是,如果再执行一次 c=c ^ b,则c的值与a相等。

从数字通信的角度说,可以把b当成一个由通信双方共同约定的密钥。甲方将ab“异或”运算后得到c,通过公共信道发送时,不掌握密钥的人即使截收了c,也很难在短时间内猜到它所代表的真实内容。乙方接收到c以后,只要将它与密钥b再进行一次“异或”运算,就能轻而易举地将其解密,恢复原来的信息。这就是专用密钥体制的基本思想,由于加密、解密密钥相同,又称为对称密钥体制。

与之相对应的还有一个公开密钥体制,它公开发布一个加密密钥,允许任何人用这个密钥将信息加密后发给自己,然后用不公开的解密密钥将其解密。其他人由于不拥有解密密钥,即使通过公共信道获得了加密信息,也无法知道其中的内容。在当前的数字通信中,公开密钥体制得到了更广泛的应用,因为理论比较复杂,这里就不展开讨论了。

在实际的数字通信过程中,传输的内容必定是一个或多个数据块,用来实现加密、解密的密钥也不会是单个字节。在一般意义上,密钥的位数越多,破解加密信息所需要花费的时间越长。

下面的程序是利用字符串“CHINA”作为密钥,实现了对键盘输入字符串加密,保存到指定的数据文件中,然后紧接着从数据文件中读出这个字符串,用同样的密钥将其解密,并将解密信息显示在屏幕上。

加密时,将输入字符串中的第一个字符与“C”相“异或”,第二个字符与“H”相“异或”,……,第五个字符与“A”相“异或”,然后将第六个字符又与“C”相“异或”,依此类推。解密的过程与加密完全相同。

程序代码如下:

 

#include

#include

#include

 

int main()

{     FILE *fp,*fp1;

       char ch, ni[81], srcfile[21];

       char mi[5]={'C','H','I','N','A'};                     // 加密、解密密钥

       int i;

       printf("please input a file name:");

    gets(srcfile);                                                 // 输入用户指定的文件名

       printf("please input a string(< 80 chars):");

    gets(ni);                                                       // 输入字符串

 

       if((fp = fopen(srcfile, "w")) == NULL)        // 以写方式打开文件,若不存在则创建

    {   printf("open file error\n");                        // 如果打开文件有误,报告错误

         exit(0);

    }

 

       i=0;

       while((ch=ni[i])!='\0'){                              // 如果未到字符串结尾则继续

              ch=ch^mi[i%5];                                 // 对一个字符进行“异或”加密

              fputc(ch,fp);                                      // 把已加密的字符写入文件

              i++;

       }

       fclose(fp);                                                // 写完后关闭文件

 

       if((fp1 = fopen(srcfile, "r")) == NULL)        // 方式打开数据文件

    {   printf("open file error\n");                   // 若不能打开则报告出错

         exit(0);

    }

       i=0;

       while((ch = fgetc(fp1)) !=EOF){                // 如果未到文件尾则继续

              ch=ch^mi[i%5];                                 // 对一个字符进行异或解密

              printf("%c",ch);                               // 把已解密字符送到屏幕显示

              i++;

       }

       fclose(fp1);                                              // 关闭文件

       printf("\n");

 

    return(0);

}

 

其实,这段程序是有些不足之处的,到实用阶段还有相当大的差距。只是程序越完善,代码就越复杂。只要掌握了基本方法,自然就会想出完善的措施。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有