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>
<ClCompile Include="main.c" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="DSA.h" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>

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

@ -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,12 +87,17 @@ 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
#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;
@ -88,9 +109,62 @@ void main(void) {
}
#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<<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);
}
}
/*for (i = size - 1; i >= 0; i--) {
/*original:
for (i = size - 1; i >= 0; i--) {
for (j = 7; j >= 0; j--) {
byte = (b[i] >> j) & 1;
printf("%u", byte);

Loading…
Cancel
Save