From 2e0bdf548726b6cbfa0c0125cc8fd3fadeee9fec Mon Sep 17 00:00:00 2001 From: Jonas Arnold Date: Fri, 24 Mar 2023 08:26:48 +0100 Subject: [PATCH] fixed project, implemented hash computation of SHA1 --- ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj | 3 - .../SW05-SHA1/SW05-SHA1.vcxproj.filters | 5 - ASYD_Cryptograhpy/SW05-SHA1/main.c | 115 +++++++++++++++--- 3 files changed, 95 insertions(+), 28 deletions(-) diff --git a/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj b/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj index 65a1f67..024cc82 100644 --- a/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj +++ b/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj @@ -21,9 +21,6 @@ - - - 16.0 Win32Proj diff --git a/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj.filters b/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj.filters index 700242d..decff76 100644 --- a/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj.filters +++ b/ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj.filters @@ -19,9 +19,4 @@ Source Files - - - Header Files - - \ No newline at end of file diff --git a/ASYD_Cryptograhpy/SW05-SHA1/main.c b/ASYD_Cryptograhpy/SW05-SHA1/main.c index 3c553cb..391c72c 100644 --- a/ASYD_Cryptograhpy/SW05-SHA1/main.c +++ b/ASYD_Cryptograhpy/SW05-SHA1/main.c @@ -25,28 +25,44 @@ #define INPUT_MESSAGE ("Testnachricht 123") #pragma region SHA1-Constants +// initial hash values #define H0 0x67452301 #define H1 0xEFCDAB89 #define H2 0x98BADCFE #define H3 0x10325476 #define H4 0xC3D2E1F0 +// constants Kt +#define K1 0x5A827999 +#define K2 0x6ED9EBA1 +#define K3 0x8F1BBCDC +#define K4 0xCA62C1D6 #pragma endregion void printBits(size_t const size, void const* const ptr); uint32_t leftRotate(uint32_t n, uint32_t d); +uint32_t SHA1_f1(uint32_t b, uint32_t c, uint32_t d); +uint32_t SHA1_f2(uint32_t b, uint32_t c, uint32_t d); +uint32_t SHA1_f3(uint32_t b, uint32_t c, uint32_t d); +uint32_t SHA1_f4(uint32_t b, uint32_t c, uint32_t d); void main(void) { int result = 0; + printf("****** SHA1 preprocessing ******\n\n"); +#pragma region Preprocessing + printf("------ Set initial hash value ------\n\n"); #pragma region Initial Hash values - uint32_t h0, h1, h2, h3, h4; - h0 = H0; - h1 = H1; - h2 = H2; - h3 = H3; - h4 = H4; + uint32_t a, b, c, d, e; + uint32_t h[5] = { H0, H1, H2, H3, H4 }; + uint32_t k[5] = { 0, K1, K2, K3, K4 }; // 5 so the array can be accessed by 1, 2, 3, 4 + a = h[0]; + b = h[1]; + c = h[2]; + d = h[3]; + e = h[4]; + #pragma endregion if (sizeof(INPUT_MESSAGE) * 8 > 447) { @@ -57,7 +73,7 @@ void main(void) { printf("------ Padding message ------\n\n"); #pragma region Padding unsigned char messageNoPadding[] = INPUT_MESSAGE; - printf("Size of message without padding: %i bits\n", sizeof(INPUT_MESSAGE) * 8); + printf("Size of message without padding: %i bits\n", (int)(sizeof(INPUT_MESSAGE) * 8)); printf("Message without padding\n"); printBits(sizeof(messageNoPadding), &messageNoPadding); unsigned char message[BLOCK_LENGTH] = ""; @@ -71,26 +87,84 @@ void main(void) { printf("\nMessage after adding 1: \n"); printBits(sizeof(message), &message); message[BLOCK_LENGTH - 1] = sizeof(INPUT_MESSAGE) * 8; - printf("\nMessage after length 1: \n"); + printf("\nMessage after adding length: \n"); printBits(sizeof(message), &message); #pragma endregion - printf("------ Message scheduling ------\n\n"); - #pragma region Message scheduling - uint32_t WordArray[80] = { 0 }; - for (uint32_t i = 0; i < 16; i++) { - uint32_t currentbyte = message[i] << 24; - uint32_t tmp = (uint32_t)(((uint8_t)(message[i * 4]) << 24) + ((uint8_t)(message[4 * i + 1]) << 16) + ((uint8_t)(message[4 * i + 2]) << 8) + (uint8_t)(message[4 * i + 3])); - WordArray[i] = tmp; - } - for (uint32_t i = 16; i < 80; i++) { - WordArray[i] = leftRotate((WordArray[i - 3] ^ WordArray[i - 8] ^ WordArray[i - 14] ^ WordArray[i - 16]), 1); - } +#pragma endregion + + printf("****** Hash computation ******\n\n"); +#pragma region Hash computation + + printf("\n------ Prepare message schedule ------\n\n"); + #pragma region Prepare message schedule + uint32_t WordArray[80] = { 0 }; + for (uint32_t i = 0; i < 16; i++) { + uint32_t currentbyte = message[i] << 24; + uint32_t tmp = (uint32_t)(((uint8_t)(message[i * 4]) << 24) + ((uint8_t)(message[4 * i + 1]) << 16) + ((uint8_t)(message[4 * i + 2]) << 8) + (uint8_t)(message[4 * i + 3])); + WordArray[i] = tmp; + } + for (uint32_t i = 16; i < 80; i++) { + WordArray[i] = leftRotate((WordArray[i - 3] ^ WordArray[i - 8] ^ WordArray[i - 14] ^ WordArray[i - 16]), 1); + } + #pragma endregion + + printf("\n------ Stages ------\n\n"); + #pragma region Stages calculations + uint32_t (*f_ptr)(uint32_t, uint32_t, uint32_t) = &SHA1_f1; // use: (*f_ptr)(b,c,d); + uint8_t t = 1; + + // stage 1...4 + for (uint32_t i = 0; i < 80; i++) { + uint32_t T = leftRotate(a, 5) + ((*f_ptr)(b, c, d)) + e + k[t] + WordArray[i]; + e = d; + d = c; + c = leftRotate(b, 30); + b = a; + a = T; + + // switch stages + if (i == 19) { f_ptr = SHA1_f2; t = 2; } + else if (i == 39) { f_ptr = SHA1_f3; t = 3; } + else if (i == 59) { f_ptr = SHA1_f4; t = 4; } + } #pragma endregion + printf("\n------ Intermediate hash calculation ------\n\n"); + #pragma region intermediate hash calculation + h[0] = a + h[0]; + h[1] = b + h[1]; + h[2] = c + h[2]; + h[3] = d + h[3]; + h[4] = e + h[4]; + #pragma endregion +#pragma endregion + + printf("\n****** Resulting hash ******\n\n"); + for (uint8_t i = 0; i < 5; i++) { + printf("%X", h[i]); + } + printf("\n\n"); + return 0; } +uint32_t SHA1_f1(uint32_t b, uint32_t c, uint32_t d) { + return (b & c) | (~b & d); +} + +uint32_t SHA1_f2(uint32_t b, uint32_t c, uint32_t d) { + return b ^ c ^ d; +} + +uint32_t SHA1_f3(uint32_t b, uint32_t c, uint32_t d) { + return (b & c) | (b & d) | (c & d); +} + +uint32_t SHA1_f4(uint32_t b, uint32_t c, uint32_t d) { + return b ^ c ^ d; +} + uint32_t leftRotate(uint32_t n, uint32_t d) { /* In n<= 0; i--) { + /*original: + for (i = size - 1; i >= 0; i--) { for (j = 7; j >= 0; j--) { byte = (b[i] >> j) & 1; printf("%u", byte);