Created
August 5, 2015 08:24
-
-
Save luc99a/70ce9631bda2ab8b2896 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#This Python script computed the k table | |
import math | |
import sys | |
final_list = [] | |
for i in range(0, 64): | |
final_list.append(math.floor(math.fabs(math.sin(i + 1)) * math.pow(2, 32))) | |
c = 0 | |
sys.stdout.write("{ ") | |
for i in final_list: | |
sys.stdout.write(hex(int(i))) | |
sys.stdout.write(",") | |
c += 1 | |
if c % 4 == 0: | |
sys.stdout.write("\n") | |
else: | |
sys.stdout.write(" ") | |
sys.stdout.write(" }\n") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* | |
* MD5 algorithm implementation | |
* by luc99a | |
* | |
* The k table has been computed by a Python script | |
* which i will post on this Git | |
* | |
* debug_print_char_array() is a function used to debug | |
* it has no use in the implementation | |
* | |
* the code still needs improovement, but it was made just | |
* for fun | |
* | |
* I'm sorry, it's not commented | |
* | |
* | |
* | |
*/ | |
#include <stdio.h> | |
#include <string.h> | |
#include <stdlib.h> | |
#include <math.h> | |
unsigned int s[] = { 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 }; | |
unsigned int K[] = { 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 }; | |
unsigned int a = 0x67452301; | |
unsigned int b = 0xefcdab89; | |
unsigned int c = 0x98badcfe; | |
unsigned int d = 0x10325476; | |
void debug_print_char_array(char* ptr, size_t size); | |
void md5_digest(char* string, char* dest); | |
void process_chunk(char* chunk); | |
unsigned int rotate_left(unsigned int n, int i); | |
void debug_print_char_array(char* ptr, size_t size) { | |
size_t i = 0; | |
for (; i < size; i++) { | |
printf("%d: %d\n", (int)i, ptr[i]); | |
} | |
} | |
void md5_digest(char* string, char* dest) { | |
size_t string_len = strlen(string); | |
char* allocated; | |
int chunks = 1 + (string_len + 8) / 64; | |
unsigned long len = (unsigned long)string_len * 8; | |
int j = string_len + 1; | |
int i = 0; | |
allocated = (char*) malloc(chunks * 64); | |
strncpy(allocated, string, string_len); | |
allocated[string_len] = 0x80; | |
for (; j < chunks * 64; j++) { | |
allocated[j] = 0; | |
} | |
j -= 8; | |
memcpy(allocated + j, &len, 8); | |
for (; i < chunks; i++) { | |
process_chunk(allocated + (i * 64)); | |
} | |
memcpy(dest, &a, sizeof(int)); | |
memcpy(dest + sizeof(int), &b, sizeof(int)); | |
memcpy(dest + (sizeof(int) * 2), &c, sizeof(int)); | |
memcpy(dest + (sizeof(int) * 3), &d, sizeof(int)); | |
free(allocated); | |
} | |
void process_chunk(char* chunk) { | |
unsigned int A = a; | |
unsigned int B = b; | |
unsigned int C = c; | |
unsigned int D = d; | |
unsigned int F; | |
unsigned int g; | |
unsigned int d_temp; | |
union m { | |
unsigned int u[16]; | |
char c[64]; | |
} M; | |
int i = 0; | |
memcpy(M.c, chunk, 64); | |
for (; i < 64; i++) { | |
if (i <= 15) { | |
F = D ^ (B & (C ^ D)); | |
g = i; | |
} else if (i >= 16 && i <= 31) { | |
F = C ^ (D & (B ^ 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) { | |
F = C ^ (B | (~D)); | |
g = (7 * i) % 16; | |
} | |
d_temp = D; | |
D = C; | |
C = B; | |
B = B + rotate_left((A + F + K[i] + M.u[g]), s[i]); | |
A = d_temp; | |
} | |
a += A; | |
b += B; | |
c += C; | |
d += D; | |
} | |
unsigned int rotate_left(unsigned int n, int i) { | |
return ((n) << i) | ((n) >> (32 - i)); | |
} | |
int main(int argc, char** argv) { | |
unsigned char buf[33]; | |
md5_digest("luc99a md5 algorithm", buf); | |
int i = 0; | |
for (; i < (sizeof(int) * 4); i++) { | |
printf("%02x", buf[i]); | |
} | |
printf("\n"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment