[ Aleksandar Marković @ 26.07.2001. 19:26 ] @
Nije najsigurniji ali.... invoke ReadFile, hFile, pMem, hSize, addr hRead, 0 mov esi, pMem mov ecx, hSize mov al, 123 xorit: xor [esi], al inc esi loop xorit 2) invoke GetTickCount ; pseudo-random number mov edx,eax ; edx= key lea esi,start mov esi,edi mov ecx,size kripter: lodsd xor eax,edx ; isto i za sifovanje i dekripciju stosd loop kripter 3) mov edx, 010011100000111111110000000000000b kripter: ror edx, 1 lodsd xor eax, edx stosd loop kripter 4) ; ########################################################################### XorData proc lpSource:DWORD,ln:DWORD,lpKey:DWORD,lnKey:DWORD LOCAL lref :DWORD ; brojac reference za key char poziciju LOCAL pcnt :DWORD LOCAL bvar :BYTE push ebx push esi push edi mov eax, lpKey mov pcnt, eax add eax, lnKey mov lref, eax mov esi, lpKey mov al,[esi] mov bvar, al ; stavlja prvi bajt u bvar mov ecx, ln mov esi, lpSource mov edi, lpSource xsSt: mov al,[esi] ; kopira prvi bajt source u al inc esi xor al, bvar ; xor al sa sledecim bajtom u bvar ; ====== Ovaj kod "resava" sudbinu prvog bajta u key string ====== ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ push eax push esi inc pcnt ; "increment" bajt adresu mov esi, pcnt ; prebacuje u esi mov al,[esi] inc esi mov ebx, lref cmp pcnt, ebx jne @F mov edx, lpKey ; stavlja "key" pocetnu adresu u edx mov pcnt, edx ; resetuje pcnt mov esi, pcnt ; stavlja adresu u esi mov al,[esi] inc esi @@: mov bvar, al pop esi pop eax ; ============================================================ mov [edi], al inc edi dec ecx cmp ecx, 0 jne xsSt pop edi pop esi pop ebx ret XorData endp ; ########################################################################### 5) XorHalf PROC Buff:DWORD, Length:DWORD mov ecx, Length mov edx, Buff lsr ecx, 3 je bye push ebx ;pravi mali skrembler a?? push edx push ecx lea ebx, [edx + ecx*4] lsl ecx, 2 push ecx invoke XorHalf, edx, ecx pop ecx invoke XorHalf, ebx, ecx pop ecx pop edx dec ecx @@: mov eax, [edx+ecx*4] xor [ebx+ecx*4], eax dec ecx jns @B pop ebx bye: ret XorHalf ENP Naravno ide brze bez PROC 6) pseudo random number generator Uzmi SEED (same starting point), generisi random key , XOR sifruje podatke, odnosno pri dekripciji koristis isti "seed" radi 'reget' originalnog 'key' SEED je random_number varijabla .data random_number dd 15 .code get_random_number: push ebx push eax mov eax,[random_number] mov ebx,31421 mul ebx add eax,6927 mov [random_number],eax pop eax pop ebx ret 7) Sifruje: void code(long* v, long* k) { unsigned long y=v[0],z=v[1], sum=0, /*pa pocinjemo*/ delta=0x9e3779b9, n=32 ; /* k.s. konstanta */ while (n-->0) { /* pocetak ciklusa*/ sum += delta ; y += (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ; z += (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ; /* kraj ciklusa*/ } v[0]=y ; v[1]=z ; } Desifruje: void decode(long* v,long* k) { unsigned long n=32, sum, y=v[0], z=v[1], delta=0x9e3779b9 ; sum=delta<<5 ; /* pocetak ciklusa*/ while (n-->0) { z-= (y<<4)+k[2] ^ y+sum ^ (y>>5)+k[3] ; y-= (z<<4)+k[0] ^ z+sum ^ (z>>5)+k[1] ; sum-=delta ; } /* kraj ciklusa*/ v[0]=y ; v[1]=z ; } [Ovu poruku je menjao secret dana 07-26-2001 u 07:43 PM GMT] |