Advertisement
Guest User

Untitled

a guest
Oct 21st, 2018
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. /*
  2.  * Simple MD5 implementation
  3.  *
  4.  * Compile with: gcc -o md5 -O3 -lm md5.c
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <stdint.h>
  10.  
  11. void md5(uint8_t *initial_msg, size_t initial_len) {
  12.  
  13.     // Message (to prepare)
  14.     uint8_t *msg = NULL;
  15.  
  16.     // Note: All variables are unsigned 32 bit and wrap modulo 2^32 when calculating
  17.  
  18.   int new_len;
  19.     for(new_len = initial_len*8 + 1; new_len%512!=448; new_len++);
  20.     new_len /= 8;
  21.  
  22.     msg = calloc(new_len + 64, 1); // also appends "0" bits
  23.                                    // (we alloc also 64 extra bytes...)
  24.     memcpy(msg, initial_msg, initial_len);
  25.     msg[initial_len] = 128; // write the "1" bit
  26.  
  27.     uint32_t bits_len = 8*initial_len; // note, we append the len
  28. memcpy(msg + new_len, &bits_len, 4);
  29.  
  30. int main(int argc, char **argv) {
  31.  
  32.     if (argc < 2) {
  33.         printf("usage: %s 'string'\n", argv[0]);
  34.         return 1;
  35.     }
  36.  
  37.     char *msg = argv[1];
  38.     size_t len = strlen(msg);
  39.  
  40.     // benchmark
  41.      int i;
  42.     for (i = 0; i < 1000000; i++) {
  43.         md5(msg, len);
  44.     }
  45.  
  46.     //var char digest[16] := h0 append h1 append h2 append h3 //(Output is in little-endian)
  47.     uint8_t *p;
  48.  
  49.     // display result
  50.  
  51.     //p=(uint8_t *)&h0;
  52.     printf("%2.2x%2.2x%2.2x%2.2x", *msg);
  53.  
  54.    
  55.  
  56.     return 0;
  57. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement