1. echo -n "string" | md5sum
-n 옵션을 안 적으면 newline character까지 계산되므로 원하지 않는 결과를 얻을 수도 있다.
2. C 프로그램 사용
불확실한 부분이 있는데, MD5_Update에서 length 제한이 없나?
컴파일 옵션: gcc md5.c -std=c99 -lssl -Wall -Wextra -Wconversion
-n 옵션을 안 적으면 newline character까지 계산되므로 원하지 않는 결과를 얻을 수도 있다.
2. C 프로그램 사용
불확실한 부분이 있는데, MD5_Update에서 length 제한이 없나?
컴파일 옵션: gcc md5.c -std=c99 -lssl -Wall -Wextra -Wconversion
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <limits.h> #include <unistd.h> #include <openssl/md5.h> void md5sum(char *str, unsigned char *c); int md5compare(unsigned char *c, unsigned char *d); int md5print(unsigned char *c); int md5sprint(unsigned char *c, char *out); int md5read(char *str, unsigned char *c); int main(int argc, char *argv[]) { unsigned char orig[MD5_DIGEST_LENGTH]; if (argc == 2) { if (md5read(argv[1], orig) != 0) { printf("usage: %s <md5sum string>\n", argv[0]); printf("error: wrong md5sum string.\n"); exit(1); } // foo(orig); } else { printf("usage: %s <md5sum string>\n", argv[0]); exit(1); } return 0; } void md5sum(char *str, unsigned char *c) { if (!str || !c) return; MD5_CTX ctx; size_t len = strlen(str); MD5_Init(&ctx); MD5_Update(&ctx, str, len); MD5_Final(c, &ctx); } int md5compare(unsigned char *c, unsigned char *d) { if (!c || !d) return 1; for (size_t i = 0; i < MD5_DIGEST_LENGTH; ++i) { if (*(c++) != *(d++)) return 1; } return 0; } // print md5 result to string int md5print(unsigned char *c) { if (!c) return 1; for (size_t i = 0; i < MD5_DIGEST_LENGTH; ++i) printf("%02x", c[i]); putchar('\n'); return 0; } int md5sprint(unsigned char *c, char *out) { if (!c || !out) return 1; for (size_t i = 0; i < MD5_DIGEST_LENGTH; ++i) { sprintf(out, "%02x", c[i]); out += 2; } *out = '\0'; return 0; } // read md5 string and store int md5read(char *str, unsigned char *c) { if (!str || !c) return 1; if (strlen(str) != 2 * MD5_DIGEST_LENGTH) return 1; for (size_t i = 0; i <MD5_DIGEST_LENGTH; ++i) { unsigned int tmp; sscanf(str, "%02x", &tmp); str += 2; #if 0 if (tmp > UCHAR_MAX) return 1; #endif *(c++) = (unsigned char) tmp; } return 0; }