谈谈异或加密

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;
}

执行结果:

[email protected]:~/docs/The_Road_to_Cpp/src$ g++ swap_ints.cc
[email protected]:~/docs/The_Road_to_Cpp/src$ ./a.out
first, x = 55555, y = 33333
and now, x = 33333, y = 55555
[email protected]:~/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

时间: 2024-08-22 16:50:57

谈谈异或加密的相关文章

lua简单地异或加密文件

用lua简单地异或加密文件,注意解密的key是加密key的倒序: 1 require 'bit' 2 3 local encode = function(inpath, outpath, key) 4 local inf = assert(io.open(inpath, "rb")) 5 local outf = assert(io.open(outpath, "wb")) 6 7 if (type(key) ~= "string") or (s

Java实现异或加密

/** * 异或加密 * * @param strOld * 源字符串 * @param strKey * 密钥 * @return 加密后的字符串 */ public static String encrypt(String strOld, String strKey) { byte[] data = strOld.getBytes(); byte[] keyData = strKey.getBytes(); int keyIndex = 0; for (int i = 0; i < strO

异或加密原理

加密原理 因为: 1. A xor B xor C = (A xor B) xor C = A xor (B xor C) 2. A xor B xor B = A 所以有: A xor B xor B = (C= A xor B) xor B = C xor B = A 公开加密后的值C,保留key B ,c xor B 得到原始数据A #PYTHON 2.7 #coding: utf-8 ''' xor operator lab ''' def xor_encode(original,key

字符串异或加密

/** *  字符串异或加密 * *  @param oldStr 被加密的字符串 *  @param x      字符偏移量 * *  @return 加密后的字符串 */ - (NSString *)getCharArrayUsingString:(NSString *)oldstr withCharOffset:(int)x { if (nil == oldstr || [@"" isEqualToString:oldstr]) { return @"";

Python异或加密字符串

import os import sys import struct def enc(path, key): path_ret = "" for i in range(0, len(path)/4): path_ret += struct.pack("<L", struct.unpack("<L", path[i*4 : (i*4)+4])[0] ^ key) return path_ret print enc("danie

CBrother异或加密与C++异或加密函数

CBrother脚本异或加密与C++异或加密函数 异或对于数据加密来说是最简单的方式,在一般的安全性要求不是非常高的地方,异或加密是最好的选择. C++异或加密代码 1 int g_PWD = 0xffee00aa; //密码 2 void XORBuf(char *data,int len) 3 { 4 int *buf = (int *)data; 5 int num = len >> 2;//够4个字节的按整形异或 6 for (int i = 0 ; i < num ; i++)

Qt使用异或进行加密解密

在加密,解密中,异或运算应该时比较简单的一种.下面的代码,采用异或运算进行加密,解密: 点击(此处)折叠或打开 #include <QtCore/QCoreApplication> #include <QTextCodec> #include <QString> #include <QDebug> QString getXorEncryptDecrypt(const QString &, const char &); QString byte

Java小知识点------最简单的加密算法(异或加密)

下面给出最简单的代码,可在该代码的基础上添加其他功能,比如将加密后的字符串输出到文件中,从文件中读取要加密或者解密的字符串等... public class Encryption {// 异或加密算法 public static void main(String[] args) { String password="中秋快乐...";//要加密或者解密的字符串 char[]array=password.toCharArray();//获取字符数组 for(int i=0;i<ar

C# 简单的异或加密文本文件或字符串

一.加解密字符串 1.加密方法:将原字符串与加密字符进行异或 1 private char[] Encrypt(string content, string secretKey) 2 { 3 char[] data = content.ToCharArray(); 4 char[] key = secretKey.ToCharArray(); 5 for (int i = 0; i < data.Length; i++) 6 { 7 data[i] ^= key[i % key.Length];