加密技术[翻译]

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

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

这门复杂的艺术叫作加密,咱们不知道第一个加密算法是何时被发明出来的,但咱们知道已有的加密算法数不胜数,从简单的掩码,到加密key和解密key都不同,技术已经进步不少。ide

下面是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中能够找到大量成熟的加密算法做为借鉴或者直接使用。
spa

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

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);


}

}
}

在加密表生成之后经过下面的代码对数据进行加密orm

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;

}
}
相关文章
相关标签/搜索