Bootstrap

简单的加密Crypt 类

(Crypt.h)

#ifndef _CRYPT_H_
#define _CRYPT_H_

#include <Windows.h>

class CCrypt
{
public :
	static BOOL Encrypt (BYTE *source, BYTE *destination, DWORD length) ;
	static BOOL Decrypt (BYTE *source, BYTE *destination, DWORD length) ;
};

#endif //~_CRYPT_H_

(Crypt.cpp)

#include "Crypt.h"

const INT C1 = 52845;
const INT C2 = 22719;
const INT KEY = 72957;

//进行加密的函数
BOOL CCrypt::Encrypt (BYTE *source , BYTE *destination, DWORD length)
{
	DWORD i;
	INT Key = KEY;
	
	if(!source || !destination || length <= 0)
		return FALSE;

	for (i = 0; i < length; i++) //加密为 BYTE 单位
	{
		destination[i] = source [i]^Key >> 8;
		//按照 Key 值进行 1BYTE 的平方,推 8bit 
		Key = (destination[i] + Key) * C1 + C2;
		//在下一 BYTE 中,通过 C1、C2 修改所要使用的 KEY 
	}
	
	return TRUE;
}

//进行解密的函数
BOOL CCrypt::Decrypt (BYTE *source , BYTE *destination, DWORD length)
{
	DWORD i;
	BYTE PreviousBlock;
	INT Key = KEY;
	
	if(!source || !destination || length <= 0)
		return FALSE;
	
	for (i = 0; i <length; i++) //加密为 BYTE 单位
	{
		PreviousBlock  = source[i];
		destination[i] = source[i]^Key  >>  8;
		Key = (PreviousBlock + Key) * C1 + C2;
		//保存之前的块(Block) ,然后查看解密所使用的 KEY 
	}
	
	return TRUE;
}

测试代码

#include <stdio.h>
#include <tchar.h>
#include "Crypt.h"


int _tmain(int argc, _TCHAR* argv[])
{
	char a1[10] = "abcdefhig";
	char a2[10] = {0};
	char a3[10] = {0};

	printf("a1=%s\n", a1);
	CCrypt::Encrypt((BYTE *)a1, (BYTE *)a2, 10);
	printf("a2=%s\n", a2);

	CCrypt::Decrypt((BYTE *)a2, (BYTE *)a3, 10);
	printf("a3=%s\n", a3);

	return 0;
}

 下面简单了解一下源代码。
const INT C1 = 52845;
const INT C2 = 22719;
const INT KEY = 72957;
上面定义的 3 个变量都是为了进行 bit 运算而成为 KEY 的变量。
从上面的 Encrypt 函数可以了解到通过一般 bit 运算进行加密的方法,它的核心
逻辑就是将 KEY 修改为 1BYTE 单位的同时进行加密。 假定所有数据转换为每 BYTE
一样的 KEY, 进行 bit 运算, 这时只需要知道该 KEY 就可以很容易地解密了。 因此,
添加修改 KEY 的公式, 就是要防止非法获取 KEY 而解密。 下面通过 Decrypt 函数了
解一下这部分的解密。


ZZ:  网游服务器编程第3章

;