加密技術[翻譯]

原文傳送門: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;

}
}
相關文章
相關標籤/搜索