游戏服务器之加密

根据网上的一个叫Xtea的算法修改的加密算法

维基上说的是需要2115.15秒来破解64轮加密的27轮。基本上说在没有key的情况下,64轮是不可破的。这里的代码只要把ROUND 的16换成64轮就可以。对于游戏的话,个人觉得16轮差不多,效率可以好些。

攻击记录:In 2004, Ko et al. presented a related-key differential attack on 27 out of 64 rounds of XTEA, requiring 220.5 chosen plaintexts and a time complexity of 2115.15 (Ko et al., 2004)

参考:

http://en.wikipedia.org/wiki/XTEA

http://www.cppblog.com/ant/archive/2007/10/12/31326.html


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


#define ROUND (64)//轮数可修改成16
unsigned int delta=0x8A3778B5;                  /* a key schedule constant 0x9E3779B9 */
#define STEP (8)//每次加密8字节,因为每次加密两个unsigned int(前端只支持最大4字节的变量)


#define CHANGE_ENCRYPT (0)


typedef unsigned int uint32_t;


static void realEncrypt(unsigned int *v, unsigned int *k) {
#if CHANGE_ENCRYPT
unsigned int y=v[0], z=v[1], i,sum = 0;         /* set up */
static const unsigned int a=k[0], b=k[1], c=k[2], d=k[3];   /* cache key */
for (i=0; i < ROUND; i++) {                        /* basic cycle start */
sum += delta;
y += ((z<<4) + a) ^ (z + delta) ^ ((z>>5) + b);
z += ((y<<4) + c) ^ (y + delta) ^ ((y>>5) + d);/* end cycle */
}
v[0]=y;
v[1]=z;
#else
unsigned int i;
uint32_t v0=v[0], v1=v[1], sum=0;
for (i=0; i < ROUND; i++) {
v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
sum += delta;
v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
}
v[0]=v0; v[1]=v1;
#endif
}


static void realDecrypt(unsigned int *v, unsigned int *k) {
#if CHANGE_ENCRYPT
unsigned int y=v[0], z=v[1],i; /* set up */


static const unsigned int a=k[0], b=k[1], c=k[2], d=k[3];    /* cache key */
for(i=0; i<ROUND; i++) {                            /* basic cycle start */
z -= ((y<<4) + c) ^ (y + delta) ^ ((y>>5) + d);
y -= ((z<<4) + a) ^ (z + delta) ^ ((z>>5) + b);
}
v[0]=y;
v[1]=z;
#else
unsigned int i;
uint32_t v0=v[0], v1=v[1],  sum=delta*ROUND;
for (i=0; i < ROUND; i++) {
v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);
sum -= delta;
v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);
}
v[0]=v0; v[1]=v1;
#endif
}


void encrypt(char* src,int srclen,const char* key)
{
char* pSrc = src;
while(srclen>=STEP)//每次加密8字节
{
realEncrypt((unsigned int *)pSrc,(unsigned int *)key);
pSrc += STEP;
srclen -= STEP;
}
}


void decrypt(char* src,int srclen,const char* key)
{
char* pSrc = src;
while(srclen>=STEP)//每次解密8字节
{
realDecrypt((unsigned int *)pSrc,(unsigned int *)key);
pSrc += STEP;
srclen -= STEP;
}
}


int main()
{
char src[] = "ADDEE2DBB3E2DBB3ADDEE2DBB3E2DBB3ADDEE2DBB3E2DBB3";//48字节
const char key[] = "4BD97521ABE2DBB5";//16字节的key
//16字节4BD97521ABE2DBB511D44901F5C6EDB4
int len = strlen(src);
printf("before(%d):%s\n",len,src);
encrypt(src,len,key);
len = strlen(src);
printf("encrypted(%d):%s\n",len,src);
decrypt(src,len,key);
len = strlen(src);
printf("decrypted(%d):%s\n",len,src);
return 0;
}


输出结果:

before(48):ADDEE2DBB3E2DBB3ADDEE2DBB3E2DBB3ADDEE2DBB3E2DBB3
encrypted(48):Oj
��+��� I��Oj
��+��� I��Oj
��+��� I��
decrypted(48):ADDEE2DBB3E2DBB3ADDEE2DBB3E2DBB3ADDEE2DBB3E2DBB3



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值