.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();
}