码迷,mamicode.com
首页 > 其他好文 > 详细

谈谈异或加密

时间:2014-08-08 21:21:45      阅读:383      评论:0      收藏:0      [点我收藏+]

标签:加密   异或   

0. 前言

本文包括如下几个内容:

  • 异或算法
  • 异或加密
  • 两个整数交换问题


1. 异或算法

异或是数字逻辑中的基本概念,也是每种编程语言都支持的基本运算。基本原理就是,对于数字1和0有如下的运算公式:

1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
0 ^ 1 = 1

很自然地,这个运算可以扩展到一长串码流上。


更常见的是字节一级或整数的异或运算,可以参考相应的编程语言的相关介绍。


2. 异或加密

异或加密是最简单的一种加密方法,简单来讲,假定有一串码流A,然后可以用key进行加密,把加密后的数据保存或发送出去。而在读取加密数据之后,再用key进行解密。

直接用代码更容易理解,如下示例:

#include <stdio.h>
#include <stdlib.h>

static void xor_encrypt(char *data, char *key, int len)
{
    int i = 0;
    for (i = 0; i < len; i++) {
        data[i] ^= key[i];
    }
}

static void dumphex(const unsigned char *data, int len)
{
    int i;
    for (i = 0; i < len; i++) {
        printf("%02X", data[i]);
    }
    printf("\n");
}

static unsigned char* get_random_key(int len)
{
    int i = 0;
    unsigned char* buffer = (unsigned char*)malloc(len);
    for (i = 0; i < len; i++) {
        buffer[i] = rand() % 10 + '0';
    }

    return buffer;
}

int main()
{
    unsigned char data[] = "hello, xor!";
    int len = sizeof(data);

    unsigned char *key;

    key = get_random_key(len);
    printf("original data: %s\n", data);
    printf("original data (hex): ");
    dumphex(data, len);

    xor_encrypt(data, key, len);
    printf("encrypted data: %s\n", data);
    printf("encrypted data (hex): ");
    dumphex(data, len);

    xor_encrypt(data, key, len);
    printf("original data: %s\n", data);
    printf("original data (hex): ");
    dumphex(data, len);

    free(key);

    return 0;
}

运行结果:

original data: hello, xor!
original data (hex): 68656C6C6F2C20786F722100
encrypted data: [S[Y\JVC7
encrypted data (hex): 5B535B595C19164A56431337
original data: hello, xor!
original data (hex): 68656C6C6F2C20786F722100

3. 交换两个整数

有些TX在面试的时候,可能会遇到这个问题,即:

有两个整数a和b,如何在不引入第三个变量的情况下,交换两个整数的值?

在了解了前面介绍的异或的概念之后,这个问题就迎刃而解。直接给出代码:

#include <stdio.h>

void swap(int &x, int &y)
{
    x ^= y;
    y ^= x;
    x ^= y;
}

int main()
{
    int x = 55555;
    int y = 33333;

    printf("first, x = %d, y = %d\n", x, y);
    swap(x, y);
    printf("and now, x = %d, y = %d\n", x, y);

    return 0;
}

执行结果:

flying-bird@flying-bird:~/docs/The_Road_to_Cpp/src$ g++ swap_ints.cc 
flying-bird@flying-bird:~/docs/The_Road_to_Cpp/src$ ./a.out 
first, x = 55555, y = 33333
and now, x = 33333, y = 55555
flying-bird@flying-bird:~/docs/The_Road_to_Cpp/src$ 

4. 再谈key

前面谈到异或加密的时候,提到的密钥key。如果是远程通信,发送方是把加密后的数据发出去的,那么接收方势必要用原始的密钥key才能解密。那么接收方如何才能拿到这个密钥呢?有关这方面,可以参考《Core Java》卷二关于加密一章的讨论。——老外的书总是深入浅出,通过一个个例子&故事,引出一系列高深的专题。推荐TXs能够好好阅读几遍。


这里再给出一种简单的数据&密钥发送发生,也是很多项目采用的方法。即:

  • 假定有原始数据data,长度为len;
  • 生成长度为len的一串密钥key(比如前面示例给出的随机数);
  • 发送数据规定为2*len长度,前面len部分是data^key,后面len部分是key;
  • 接收方收到数据之后,就用后面len部分异或到前面len部分,最后的结果就是原始数据。


当然了,可能这个也比较简单。那么可以在此基础上进一步引入其他的算法,比如:

  • 增加一个字节,引入奇偶校验码;——参考《IMSI编码规则与奇偶校验算法
  • 将码流顺序按照一定的规律打乱,比如相邻的两个字节交换;
  • 等等


5. 参考资料

维基百科的异或加密介绍:http://zh.wikipedia.org/wiki/%E5%BC%82%E6%88%96%E5%8A%A0%E5%AF%86

谈谈异或加密,布布扣,bubuko.com

谈谈异或加密

标签:加密   异或   

原文地址:http://blog.csdn.net/a_flying_bird/article/details/38443945

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!