1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
#include <iostream>
#include <iomanip>
using namespace std;
unsigned int rotateL(unsigned int x, int n)
{
return ((x) << n) | ((x) >> (32 - n));
}
int main()
{
// per-round shift amounts
unsigned int r[64] = {7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22
,5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20
,4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23
,6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21};
// binary integer part of the sines of integers (Radians) as constants
unsigned int k[64] = {0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee
,0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501
,0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be
,0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821
,0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa
,0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8
,0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed
,0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a
,0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c
,0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70
,0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05
,0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665
,0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039
,0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1
,0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1
,0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 };
//Initialize Vars
unsigned int a = 0x67452301;
unsigned int b = 0xefcdab89;
unsigned int c = 0x98badcfe;
unsigned int d = 0x10325476;
// TODO: append single 1 bit
// TODO: pad with 0's until message length is 448 bits
// message hard coded for empty string
// for empty string, m = 1000... and so on, for 512 bits total.
unsigned int m[16] = {0x80000000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
//Make a copy of above
unsigned int A = a;
unsigned int B = b;
unsigned int C = c;
unsigned int D = d;
int F;
int g;
for(int i = 0; i <= 63; i++)
{
if(i >= 0 && i <= 15)
{
F = (B & C) | ((~B) & D);
g = i;
}
else if(i >= 16 && i <= 31)
{
F = (D & B) | ((~D) & C);
g = (5*i + 1)% 16;
}
else if(i >= 32 && i <= 47)
{
F = B ^ C ^ D;
g = (3*i + 5) % 16;
}
else if(i >= 48 && i <= 63)
{
F = C ^ (B | (~D));
g = (7*i) % 16;
}
int dTemp = D;
D = C;
C = B;
B = B + rotateL((A + F + k[i] + m[g]), r[i]);
A = dTemp;
}
a += A;
b += B;
c += C;
d += D;
cout << "Digest: " <<
hex << a <<
hex << b <<
hex << c <<
hex << d << endl;
return 0;
}
|