zoukankan      html  css  js  c++  java
  • 使用异或运算对数据及文件进行加密处理,附软件及源码

    前几天写了一篇文章是在C语言中使用异或运算交换两个任意类型变量,其基础为使用^交换两个整数的算法:

    a ^= b;
    b ^= a;
    a ^= b;

    如果你看明白这个算法,就会发现这样的规律:一个数异或另一个数两次后,该数保持不变。即:

      c = a^b;

      c = c^b;

      c == a;

    这一规律就是使用异或运算对数据及文件进行加密处理的基本原理。

    那就先贴下加密算法的代码:

    bool XorEncrypt(void* bufPtr, unsigned int bufSize, const char* key, unsigned int keySize)
    {
        if (!bufPtr || !key || keySize == 0)
        {
            return false;
        }
        char* ptr = (char*)bufPtr;
    
        unsigned int index;
        for (unsigned int i = 0; i < bufSize; i++)
        {
            index = i%keySize;
            ptr[i] ^= key[index];
        }
    
        return true;
    }

    代码中

    bufPtr为需要加密的数据指针
    bufSize为需要加密的数据长度

    key为密钥数据指针

    keySize为密钥数据长度

    再附上测试代码:

    void main()
    {
        const char* szKey = "Garbageman is grabage";
        unsigned int keySize = strlen(szKey);
    
        int test_int[10] = 
        {0, 0xff356992, 323, 23582, 0x90abcd,
         332335, 69895, 456812, 548, 7646};
    
        float test_float[10] = 
        {0.0f, 1.000001f, 953214.12f, 3658.01f, 5245.045f, 
         1.000001f, 953214.12f, 3658.0f, 9545.0f, 65323.0f};
    
        double test_double[10] = 
        {0.0, 1.000001, 953214.12, 3658.01, 5245.045, 
        1.000001, 953214.12, 3658.0, 9545.0, 65323.0};
    
        // 加密
        XorEncrypt(test_int, sizeof(test_int), szKey, keySize);
        XorEncrypt(test_float, sizeof(test_float), szKey, keySize);
        XorEncrypt(test_double, sizeof(test_double), szKey, keySize);
    
        // 解密
        XorEncrypt(test_int, sizeof(test_int), szKey, keySize);
        XorEncrypt(test_float, sizeof(test_float), szKey, keySize);
        XorEncrypt(test_double, sizeof(test_double), szKey, keySize);
    
        int m = 0;
    }

    当数据被两次执行XorEncrypt函数后,其数值是不会发生变化的。看一下调试时的截图:

    (1)未执行XorEncrypt的数值,即未加密的数据:

    (2)第一次执行XorEncrypt后的数值,即加密后的数据:

    (3)第二次执行XorEncrypt后的数值,即解密后的数据:

    这如同变魔术一样,数据变乱了,又能恢复回来。

    该算法同样可以对文件数据进行处理,下图为我写的这个小软件截图:一幅是文件加密前的,一幅是加密处理后的

    软件写得很简单,能支持处理的最大文件取决于你的电脑一次最多申请的内存。顺便说一下,异或是一种很弱的加密方法,很容易被破解。

    软件及其源码下载:http://files.cnblogs.com/WhyEngine/FileEncrypt.zip

  • 相关阅读:
    移动端文本编辑器
    jquery移动端日期插件
    Spring 4集成 Quartz2(转)
    json 特殊字符 javascript 特殊字符处理(转载)
    解决使用JavaScriptConvert转换对象为Json时,中文和&符号被转码的问题
    RFID的winform程序心得2
    异步编程模型
    DataGridView获取或者设置当前单元格的内容
    DataGridView修改数据并传到数据库
    把存储过程结果集SELECT INTO到临时表
  • 原文地址:https://www.cnblogs.com/WhyEngine/p/4051347.html
Copyright © 2011-2022 走看看