C语言中md5的数据读取与填充

Python09

C语言中md5的数据读取与填充,第1张

查阅fread函数,可以实现按照字节批次读取,你的文件最好用二进制方式打开。

查阅剩余数据,恐怕得实际读取才知道,但是每次读取文件都会改变文件指针的位置,你需要用fseek来移动文件指针回到原本的位置。

函数 size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)函数说明 fread()用来从文件流中读取数据。参数stream为已打开的文件指针,参数ptr 指向欲存放

读取进来的数据空间,读取的字符数以参数size*nmemb来决定。Fread()会返回实际读取到的nmemb数目,

如果此值比参数nmemb 来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()

来决定发生什么情况。

(转载) #include <stdio.h> #include <stdlib.h> #include <memory.h> #include <time.h> #include <errno.h> #include <string.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include "../md5/md5.h" #define T1 0xd76aa478 #define T2 0xe8c7b756 #define T3 0x242070db #define T4 0xc1bdceee #define T5 0xf57c0faf #define T6 0x4787c62a #define T7 0xa8304613 #define T8 0xfd469501 #define T9 0x698098d8 #define T10 0x8b44f7af #define T11 0xffff5bb1 #define T12 0x895cd7be #define T13 0x6b901122 #define T14 0xfd987193 #define T15 0xa679438e #define T16 0x49b40821 #define T17 0xf61e2562 #define T18 0xc040b340 #define T19 0x265e5a51 #define T20 0xe9b6c7aa #define T21 0xd62f105d #define T22 0x02441453 #define T23 0xd8a1e681 #define T24 0xe7d3fbc8 #define T25 0x21e1cde6 #define T26 0xc33707d6 #define T27 0xf4d50d87 #define T28 0x455a14ed #define T29 0xa9e3e905 #define T30 0xfcefa3f8 #define T31 0x676f02d9 #define T32 0x8d2a4c8a #define T33 0xfffa3942 #define T34 0x8771f681 #define T35 0x6d9d6122 #define T36 0xfde5380c #define T37 0xa4beea44 #define T38 0x4bdecfa9 #define T39 0xf6bb4b60 #define T40 0xbebfbc70 #define T41 0x289b7ec6 #define T42 0xeaa127fa #define T43 0xd4ef3085 #define T44 0x04881d05 #define T45 0xd9d4d039 #define T46 0xe6db99e5 #define T47 0x1fa27cf8 #define T48 0xc4ac5665 #define T49 0xf4292244 #define T50 0x432aff97 #define T51 0xab9423a7 #define T52 0xfc93a039 #define T53 0x655b59c3 #define T54 0x8f0ccc92 #define T55 0xffeff47d #define T56 0x85845dd1 #define T57 0x6fa87e4f #define T58 0xfe2ce6e0 #define T59 0xa3014314 #define T60 0x4e0811a1 #define T61 0xf7537e82 #define T62 0xbd3af235 #define T63 0x2ad7d2bb #define T64 0xeb86d391 static void md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/) { md5_word_t a = pms->abcd[0], b = pms->abcd[1], c = pms->abcd[2], d = pms->abcd[3] md5_word_t t #ifndef ARCH_IS_BIG_ENDIAN # define ARCH_IS_BIG_ENDIAN 1 /* slower, default implementation */ #endif #if ARCH_IS_BIG_ENDIAN /* * On big-endian machines, we must arrange the bytes in the right * order. (This also works on machines of unknown byte order.) */ md5_word_t X[16] const md5_byte_t *xp = data int i for (i = 0i <16i, xp = 4) X[i] = xp[0] (xp[1] <<8) (xp[2] <<16) (xp[3] <<24) #else /* !ARCH_IS_BIG_ENDIAN */ /* * On little-endian machines, we can process properly aligned data * without copying it. */ md5_word_t xbuf[16] const md5_word_t *X if (!((data - (const md5_byte_t *)0) &3)) { /* data are properly aligned */ X = (const md5_word_t *)data } else { /* not aligned */ memcpy(xbuf, data, 64) X = xbuf } #endif #define ROTATE_LEFT(x, n) (((x) <<(n)) | ((x) >>(32 - (n)))) /* Round 1. */ /* Let [abcd k s i] denote the operation a = b ((a F(b,c,d) X[k] T[i]) <<<s). */ #define F(x, y, z) (((x) &(y)) | (~(x) &(z))) #define SET(a, b, c, d, k, s, Ti)\ t = a F(b,c,d) X[k] Ti\ a = ROTATE_LEFT(t, s) b /* Do the following 16 operations. */ SET(a, b, c, d, 0, 7, T1) SET(d, a, b, c, 1, 12, T2) SET(c, d, a, b, 2, 17, T3) SET(b, c, d, a, 3, 22, T4) SET(a, b, c, d, 4, 7, T5) SET(d, a, b, c, 5, 12, T6) SET(c, d, a, b, 6, 17, T7) SET(b, c, d, a, 7, 22, T8) SET(a, b, c, d, 8, 7, T9) SET(d, a, b, c, 9, 12, T10) SET(c, d, a, b, 10, 17, T11) SET(b, c, d, a, 11, 22, T12) SET(a, b, c, d, 12, 7, T13) SET(d, a, b, c, 13, 12, T14) SET(c, d, a, b, 14, 17, T15) SET(b, c, d, a, 15, 22, T16) #undef SET /* Round 2. */ /* Let [abcd k s i] denote the operation a = b ((a G(b,c,d) X[k] T[i]) <<<s). */ #define G(x, y, z) (((x) &(z)) | ((y) &~(z))) #define SET(a, b, c, d, k, s, Ti)\ t = a G(b,c,d) X[k] Ti\ a = ROTATE_LEFT(t, s) b /* Do the following 16 operations. */ SET(a, b, c, d, 1, 5, T17) SET(d, a, b, c, 6, 9, T18) SET(c, d, a, b, 11, 14, T19) SET(b, c, d, a, 0, 20, T20) SET(a, b, c, d, 5, 5, T21) SET(d, a, b, c, 10, 9, T22) SET(c, d, a, b, 15, 14, T23) SET(b, c, d, a, 4, 20, T24) SET(a, b, c, d, 9, 5, T25) SET(d, a, b, c, 14, 9, T26) SET(c, d, a, b, 3, 14, T27) SET(b, c, d, a, 8, 20, T28) SET(a, b, c, d, 13, 5, T29) SET(d, a, b, c, 2, 9, T30) SET(c, d, a, b, 7, 14, T31) SET(b, c, d, a, 12, 20, T32) #undef SET