Skip to content

Instantly share code, notes, and snippets.

@luc99a
Created August 5, 2015 08:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save luc99a/70ce9631bda2ab8b2896 to your computer and use it in GitHub Desktop.
Save luc99a/70ce9631bda2ab8b2896 to your computer and use it in GitHub Desktop.
#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")
/*
*
* 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