Смекни!
smekni.com

Хеш-функция UMAC (стр. 3 из 3)

.386

.model flat,stdcall

PUBLIC UMAC24

.data

r1 db 0

r2 db 0

r3 db 0

byteCnt db 0

bitCnt db 0 ;?

counter dd 0

countmes dd 0

countres dd 0

.data?

s1 db ?

s2 db ?

s3 db ?

byte1 db ?

.code

UMAC24 proc message:BYTE, secret:BYTE, len:DWORD, result:BYTE

mov edi,len

mmm:

.if byteCnt == 0

mov ecx,counter

mov al,secret

mov bl,[eax+ecx]

mov s1,bl

inc ecx

mov bl,[eax+ecx]

mov s2,bl

inc ecx

mov bl,[eax+ecx]

mov s3,bl

inc ecx

mov counter,ecx

mov byteCnt,2

.endif

dec byteCnt

mov ecx, countmes

mov al,message

mov bl, [eax+ecx]

mov byte1,bl

inc ecx

mov countmes,ecx

mov ecx,7

metka:

mov al, byte1

AND al,1

.if ( al != 0) //msg not divisible by x

mov bl,s1 //so add s1

xor r1,bl

mov bl,s2

xor r2,bl

mov bl,s3

xor r3,bl

.endif

shr byte1,1 //divide message by x

mov al,s3

AND al,80h

.if al != 0 //and multiply secret with x, subtracting the polynomial when necessary to keep it's.

shl s3,1

mov al,s2

AND al,80h

.if al !=0

mov bl,s3

OR bl,1

mov s3,bl

shl s2,1

.endif

mov al,s1

AND al,80h

.if al !=0

mov bl,s2

OR bl,1

mov s2,bl

shl s1,1

.endif

mov al,s1

xor al,1Bh // x^24 + x^4 + x^3 + x + 1

mov s1,al

.else

shl s3,1

mov al,s2

AND al,80h

.if al !=0

mov bl,s3

Or bl,1

mov s3,bl

shl s2,1

.endif

mov al,s1

AND al,80h

.if al !=0

mov bl,s2

OR bl,1

mov s2,bl

shl s1,1

.endif

.endif

dec ecx

jns metka //for each bit in the message

dec edi

jns mmm //for each byte in the message

mov al,result

mov ecx,0

mov bl, [eax+ecx]

xor bl,r1

mov [eax+ecx],bl

inc ecx

mov bl, [eax+ecx]

xor bl,r2

mov [eax+ecx],bl

inc ecx

mov bl, [eax+ecx]

xor bl,r3

mov [eax+ecx],bl

mov bl, [eax+ecx]

xor bl,r3

mov [eax+ecx],bl

ret

UMAC24 endp

END

Это код на С++.На нем реализован ввод-вывод данных.Сам алгоритм выполняет функция.

#include <iostream.h>

#include <math.h>

#include <windows.h>

#include <stdio.h>

#include <string.h>

extern "C" __stdcall UMAC24(unsigned char *msg, unsigned char *secret, int len, unsigned char *result); //объявиливнешнююфункцию(тукотораянаасме)

int bin(bool *str){

long b(0);

int count(0);

for(int i(31);i>=0;i--){

if(str[i]==1){b+=pow(2,count);}

count++;

}

return b;

}

void main(){

unsigned char msg[100]; //создали статические массивы размером 100 символов

unsigned char secr[100];

unsigned char rez[]={0,0,0,0}; //результат(хэш) имеет всегда фиксированное значение - 24 бита

int len(0); //длина сообщения(кол-во символов в нем)

cout<<"Enter message:"<<endl;

cin.getline(msg,100); //считываем введенное сообщение в массив msg

cout<<"Enter key:"<<endl;

cin.getline(secr,100); //считываемключ

for(int i(0);;i++){len++;if(msg[i]==NULL){break;}} //считаемдлинувведенногосообщения

UMAC24(msg,secr,len,rez); //вызываемвнешнююфункцию

cout<<endl<<"Hash UMAC24:"<<endl;

bool masbin[32];

int a;

for(int ii(0);ii<3;ii++){

for(int j=0;j<32;j++){

masbin[31-j]=rez[ii]%2;

rez[ii]=rez[ii]>>1;} //получили массив с представлением числа в двоичной форме

a=bin(masbin);

cout<<hex<<a; //вывод на экран в 16-ричном виде

}cout<<endl;

cin.get();

cin.get();

}