fixed project,

implemented hash computation of SHA1
main
Jonas Arnold 3 years ago
parent 2b17532f05
commit 2e0bdf5487
  1. 3
      ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj
  2. 5
      ASYD_Cryptograhpy/SW05-SHA1/SW05-SHA1.vcxproj.filters
  3. 97
      ASYD_Cryptograhpy/SW05-SHA1/main.c

@ -21,9 +21,6 @@
<ItemGroup> <ItemGroup>
<ClCompile Include="main.c" /> <ClCompile Include="main.c" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ClInclude Include="DSA.h" />
</ItemGroup>
<PropertyGroup Label="Globals"> <PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion> <VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>

@ -19,9 +19,4 @@
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ClInclude Include="DSA.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project> </Project>

@ -25,28 +25,44 @@
#define INPUT_MESSAGE ("Testnachricht 123") #define INPUT_MESSAGE ("Testnachricht 123")
#pragma region SHA1-Constants #pragma region SHA1-Constants
// initial hash values
#define H0 0x67452301 #define H0 0x67452301
#define H1 0xEFCDAB89 #define H1 0xEFCDAB89
#define H2 0x98BADCFE #define H2 0x98BADCFE
#define H3 0x10325476 #define H3 0x10325476
#define H4 0xC3D2E1F0 #define H4 0xC3D2E1F0
// constants Kt
#define K1 0x5A827999
#define K2 0x6ED9EBA1
#define K3 0x8F1BBCDC
#define K4 0xCA62C1D6
#pragma endregion #pragma endregion
void printBits(size_t const size, void const* const ptr); void printBits(size_t const size, void const* const ptr);
uint32_t leftRotate(uint32_t n, uint32_t d); 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) { void main(void) {
int result = 0; int result = 0;
printf("****** SHA1 preprocessing ******\n\n");
#pragma region Preprocessing
printf("------ Set initial hash value ------\n\n"); printf("------ Set initial hash value ------\n\n");
#pragma region Initial Hash values #pragma region Initial Hash values
uint32_t h0, h1, h2, h3, h4; uint32_t a, b, c, d, e;
h0 = H0; uint32_t h[5] = { H0, H1, H2, H3, H4 };
h1 = H1; uint32_t k[5] = { 0, K1, K2, K3, K4 }; // 5 so the array can be accessed by 1, 2, 3, 4
h2 = H2; a = h[0];
h3 = H3; b = h[1];
h4 = H4; c = h[2];
d = h[3];
e = h[4];
#pragma endregion #pragma endregion
if (sizeof(INPUT_MESSAGE) * 8 > 447) { if (sizeof(INPUT_MESSAGE) * 8 > 447) {
@ -57,7 +73,7 @@ void main(void) {
printf("------ Padding message ------\n\n"); printf("------ Padding message ------\n\n");
#pragma region Padding #pragma region Padding
unsigned char messageNoPadding[] = INPUT_MESSAGE; 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"); printf("Message without padding\n");
printBits(sizeof(messageNoPadding), &messageNoPadding); printBits(sizeof(messageNoPadding), &messageNoPadding);
unsigned char message[BLOCK_LENGTH] = ""; unsigned char message[BLOCK_LENGTH] = "";
@ -71,12 +87,17 @@ void main(void) {
printf("\nMessage after adding 1: \n"); printf("\nMessage after adding 1: \n");
printBits(sizeof(message), &message); printBits(sizeof(message), &message);
message[BLOCK_LENGTH - 1] = sizeof(INPUT_MESSAGE) * 8; message[BLOCK_LENGTH - 1] = sizeof(INPUT_MESSAGE) * 8;
printf("\nMessage after length 1: \n"); printf("\nMessage after adding length: \n");
printBits(sizeof(message), &message); printBits(sizeof(message), &message);
#pragma endregion #pragma endregion
printf("------ Message scheduling ------\n\n"); #pragma endregion
#pragma region Message scheduling
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 }; uint32_t WordArray[80] = { 0 };
for (uint32_t i = 0; i < 16; i++) { for (uint32_t i = 0; i < 16; i++) {
uint32_t currentbyte = message[i] << 24; uint32_t currentbyte = message[i] << 24;
@ -88,9 +109,62 @@ void main(void) {
} }
#pragma endregion #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; 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) uint32_t leftRotate(uint32_t n, uint32_t d)
{ {
/* In n<<d, last d bits are 0. To put first 3 bits of n at /* In n<<d, last d bits are 0. To put first 3 bits of n at
@ -111,7 +185,8 @@ void printBits(size_t const size, void const* const ptr)
printf("%u", byte); printf("%u", byte);
} }
} }
/*for (i = size - 1; i >= 0; i--) { /*original:
for (i = size - 1; i >= 0; i--) {
for (j = 7; j >= 0; j--) { for (j = 7; j >= 0; j--) {
byte = (b[i] >> j) & 1; byte = (b[i] >> j) & 1;
printf("%u", byte); printf("%u", byte);

Loading…
Cancel
Save