#include #include #include #include #include #include #include "genSha1.h" #define rol(x,n) ((x << n) | (x >> (32-n))) void getSha1FromBlock(unsigned char* str, uint32_t &h0, uint32_t &h1, //obliczenia na każdym bloku uint32_t &h2, uint32_t &h3, uint32_t &h4){ uint32_t *w, a, b, c, d, e, k, f, tmp; w = new uint32_t[80]; for(int j = 0; j < 16; j++){ w[j] = str[j*4 + 0] * 0x1000000 //ustawianie szesnastu 32-bitowych słów + str[j*4 + 1] * 0x10000 + str[j*4 + 2] * 0x100 + str[j*4 + 3]; } for(int j = 16; j < 80; j++){ //rozszerzanie szesnastu słów do osiemdziesięciu w[j] = rol((w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16]),1); } a = h0; //inicjalizacja a,b,c,d,e b = h1; c = h2; d = h3; e = h4; for(int m=0;m<80;m++){ //działania... if(m <= 19){ f = (b & c) | ((~b) & d); k = 0x5A827999; } else if(m <= 39){ f = b ^ c ^ d; k = 0x6ED9EBA1; } else if(m <= 59){ f = (b & c) | (b & d) | (c & d); k = 0x8F1BBCDC; } else { f = b ^ c ^ d; k = 0xCA62C1D6; } tmp = (rol(a,5) + f + e + k + w[m]); e = d; d = c; c = rol(b,30); b = a; a = tmp; } h0 = h0 + a; //przypis wartości h1 = h1 + b; h2 = h2 + c; h3 = h3 + d; h4 = h4 + e; delete[] w; } void sha1(unsigned char* message,unsigned short messageLength,char *result){ int size = 64; //rozmiar jednego bloku musi być 512bit unsigned char *block; block = new unsigned char[size]; memset(block,0,size); memcpy(block, message,messageLength* sizeof(char)); block[messageLength] = 0x80;//tuż po zakończeniu wiadomości dodaje bity 10000000 messageLength =messageLength* sizeof(char)*8; //rozmiar wiadomości w bitach block[63] = messageLength; // rozmiar wiadomość zapisany jako big-endian block[62] = messageLength >> 8; uint32_t h0, h1, h2, h3, h4; //wartości początkowe (z wikipedii) h0 = 0x67452301; h1 = 0xEFCDAB89; h2 = 0x98BADCFE; h3 = 0x10325476; h4 = 0xC3D2E1F0; getSha1FromBlock(block, h0, h1, h2, h3, h4); sprintf(result, "%08x%08x%08x%08x%08x", h0, h1, h2, h3, h4); delete[] block; }