根据密码表进行数据加密/解密的代码(纯C书写)
根据密码表进行数据加密/解密的代码(纯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);
}