青山相待

            白云相爱

            梦不到紫罗袍共黄金带

            一茅斋

            野花开

            管甚谁家兴废谁成败

            陋巷单瓢亦乐哉

            贫,气不改!

            达,志不改!

加密技术[翻译]

原文传送门:http://sfsrealm.hopto.org/inside_mopaq/chapter2.htm#hashes

安保系统的需求亘古有之,人们试图保护隐私的需求已经有数千年的历史,古希腊用脚携带手写信件,二战的无线电传输,现在通过网络信用卡信息。

这门复杂的艺术叫做加密,我们不知道第一个加密算法是什么时候被发明出来的,但我们知道已有的加密算法数不胜数,从简单的掩码,到加密key和解密key都不一样,技术已经进步很多。

下面是Basic Lab Notes公布的一个简单加密算法。

void EncryptBlock(void *lpvBlock, int nBlockLen, char *lpszPassword)
{

int nPWLen = strlen(lpszPassword), nCount = 0;
char *lpsPassBuff = (char *)_alloca(nPWLen);

memcpy(lpsPassBuff, lpszPassword, nPWLen);

for (int nChar = 0; nCount < nBlockLen; nCount++)
{


char cPW = lpsPassBuff[nCount];

lpvBlock[nChar] ^= cPW;

lpsPassBuff[nCount] = cPW + 13;

nCount = (nCount + 1) % nPWLen;

}

return;
}

这个程序很简单,不应当运用在商用程序中,在openssl中可以找到大量成熟的加密算法作为借鉴或者直接使用。

想要和MPQs格式打交道就必须了解加密算法,MPQs的加密技术是其他加密技术的有趣融合,它创建了一个加密表,并使用文件加密key从表中找出特定的成员,将要加密的数据和加密表成员异或,下面的代码生成加密表。

void prepareCryptTable()
{

unsigned long seed = 0x00100001, index1 = 0, index2 = 0, i;

for(index1 = 0; index1 < 0x100; index1++)
{


for(index2 = index1, i = 0; i < 5; i++, index2 += 0x100)
{



unsigned long temp1, temp2;

seed = (seed * 125 + 3) % 0x2AAAAB;
temp1 = (seed & 0xFFFF) << 0x10;

seed = (seed * 125 + 3) % 0x2AAAAB;
temp2 = (seed & 0xFFFF);

cryptTable[index2] = (temp1 | temp2);


}

}
}

在加密表生成以后通过下面的代码对数据进行加密

void DecryptBlock(void *block, long length, unsigned long key)
{

unsigned long seed = 0xEEEEEEEE, unsigned long ch;
unsigned long *castBlock = (unsigned long *)block;

// Round to longs
length >>= 2;

while(length-- > 0)
{


seed += stormBuffer[0x400 + (key & 0xFF)];
ch = *castBlock ^ (key + seed);

key = ((~key << 0x15) + 0x11111111) | (key >> 0x0B);
seed = ch + seed + (seed << 5) + 3;
*castBlock++ = ch;

}
}

posted @ 2015-08-06 16:17  Leo.Z  阅读(341)  评论(0编辑  收藏  举报