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

 }

 


Информация о работе «Хеш-функция UMAC»
Раздел: Информатика, программирование
Количество знаков с пробелами: 22087
Количество таблиц: 0
Количество изображений: 4

0 комментариев


Наверх