C语言直接对数据加密解密

来源:互联网 发布:数据移植测试 编辑:程序博客网 时间:2024/05/17 06:28
/*根据密码表进行数据加密/解密的代码(纯C书写)*/


/* 数据加密, 解密程序 by Flying Blue 081130 */
/* 这个程序是为我的游戏进行数据加密用的, 现在我把它开源 */
/* 理论上来说, 这个程序可以在任何编译器上编译 */

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

/* 求区间在[mmin, mmax]的随机数 */
int random(int mmin, int mmax)
{
    return rand() % (mmax - mmin + 1) + mmin;
}

/* 交换两个值 */
void _swap(unsigned char* arr, int i1, int i2)
{
    unsigned char tmp = arr[i1];
    arr[i1] = arr[i2];
    arr[i2] = tmp;
}

/* 随机生成编码表 */
void cipher_GenEncTable(unsigned char strTable[0x100])
{
    int i, n1, n2;

    /* 初始化随机数种子 */
    srand(time(0));

    /* 先生成一张按顺序的ASCII码表 */
    for(i = 0; i < 0x100; i++)
        strTable[i] = i;

    /* 再随机交换其中的两个值 */
    for(i = 0; i < 0x100; i++)
    {
        n1 = random(0, 0xFF);

        /* 防止生成的 n1 == n2 如果他们相等了那就没意义了 */
        while(n1 == (n2 = random(0, 0xFF)));

        /* 交换第n1个和第n2个值 */
        _swap(strTable, n1, n2);
    }
}

/* 根据编码表得到其解码表 */
void cipher_EncToDecTable(const unsigned char strEncTable[0x100], unsigned char strDecTable[0x100])
{
    int i;
    for(i = 0; i < 0x100; i++)
    {
        strDecTable[strEncTable[i]] = i;
    }
}

/* 打印出表内数据 */
void cipher_PrintTable(unsigned char strTable[0x100])
{
    int i, j, count;
    count = 0;

    printf("unsigned char Table[] = \n{\n");
    for(i = 0; i < 0x10; i++)
    {
        printf("\t");
        for(j = 0; j < 0x10; j++)
        {
            printf("0x%02X, ", strTable[count]);
            count++;
        }
        printf("\n");
    }
    printf("};\n");
}

/*
 * 根据给的表的不同进行数据编码(解码)
 * 其实, 编码表和解码表的意义是相同的,
 * 编码表可以用来解码, 解码表可以用来编码,
 * 只是叫法不同而已.
 */

void cipher_Coding(const unsigned char *src, unsigned char *dst, int len, const unsigned char strTable[0x100])
{
    int i;
    for(i = 0; i < len; i++)
    {
        dst[i] = strTable[src[i]];
    }
}

void main()
{
    unsigned char tblEnc[0x100], tblDec[0x100];
    cipher_GenEncTable(tblEnc);                /* 生成编码表 */
    cipher_PrintTable(tblEnc);

    cipher_EncToDecTable(tblEnc, tblDec);    /* 根据编码表生成解码表 */
    cipher_PrintTable(tblDec);

    char *str = "你好你是谁?我也不知道";
    printf("原文: %s\n", str);

    char strdst[50] = {0};
    cipher_Coding((unsigned char*)str, (unsigned char*)strdst, 23, tblEnc);
    printf("密文: %s\n", strdst);

    cipher_Coding((unsigned char*)strdst, (unsigned char*)strdst, 23, tblDec);
    printf("明文: %s\n", strdst);

}
0 0
原创粉丝点击