5. Инструкция пользователя
Для начала работы с программой находим umac.exe и запускаем его.
На экране появится «Enter message», после чего мы воодим нужное нам сообщение и нажимаем Enter. Затем на экране появится «Enter key», после чего мы вводим ключ (длина ключа короче чем сообщения или равна ему. В противном случае те символы, которые вышли за рамки сообщения принимать участия в кодировании не будут. ), известный только нам и получателю и снова жмем Enter.
Затем на экране видим зашифрованное сообщение. Программа выполнила требуемую операцию.
ВЫВОДЫ
- UMAC является самым быстрым среди MAC- алгоритмов.
- Является безопасным и криптостойким. Выдерживает множество видов атак.
-При помощи данной хэш-функции можно зашифровать скольугодно большое количество информации.
- Нет обоснования выбора конструкции, функций, констант.
-Сохраняет конфиденциальность, аутентичность, целостность,неопровергаемость.
ПЕРЕЧЕНЬ ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
1. Зубков С. В. - Assembler – язык неограниченных возможностей. «ДМК Пресс» - 1999г.
2. http://fastcrypto.org/umac
3. http://en.wikipedia.org/wiki/UMAC
4. Кип Р. Ирвин Язык ассемблера для процессоров INTEL, 4-е изд. /Пер. с англ. – М..: – Издательский дом “ВИЛЬЯМС”, 2005 г. – 912 с., ил. – Парал. Тит. Англ.
5. J. Black, S. Halevi, H. Krawczyk, T. Krovetz, and P. Rogaway, "UMAC: Fast and provably secure message authentication", Advances in Cryptology - CRYPTO '99, LNCS vol. 1666, pp. 216-233, Springer-Verlag, 1999.
Приложение А. Графическое представление программы.
1. Открываем программу и пишем сообщение:
2. Вводим ключ:
3. Получаем зашифрованное сообщение:
Приложение Б.
UMAC24 - код на ассемблере.Это внешняя функция, которая прикомпилируется к коду на с++, в качестве объектного файла.
.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();
}
0 комментариев