• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            md5的實現

            Posted on 2010-10-09 16:44 Prayer 閱讀(633) 評論(0)  編輯 收藏 引用 所屬分類: 算法
             具體的一個MD5實現
              /*
              * md5 -- compute and check MD5 message digest.
              * this version only can calculate the char string.
              *
              * MD5 (Message-Digest algorithm 5) is a widely used, partially
              * insecure cryptographic hash function with a 128-bit hash value.
              *
              * Author: redraiment
              * Date: Aug 27, 2008
              * Version: 0.1.6
              */
              #include <stdlib.h>
              #include <string.h>
              #include <stdio.h>
              #include <math.h>
              #define SINGLE_ONE_BIT 0x80
              #define BLOCK_SIZE 512
              #define MOD_SIZE 448
              #define APP_SIZE 64
              #define BITS 8
              // MD5 Chaining Variable
              #define A 0x67452301UL
              #define B 0xEFCDAB89UL
              #define C 0x98BADCFEUL
              #define D 0x10325476UL
              // Creating own types
              #ifdef UINT64
              # undef UINT64
              #endif
              #ifdef UINT32
              # undef UINT32
              #endif
              typedef unsigned long long UINT64;
              typedef unsigned long UINT32;
              typedef unsigned char UINT8;
              typedef struct
              {
              char * message;
              UINT64 length;
              }STRING;
              const UINT32 X[4][2] = {{0, 1}, {1, 5}, {5, 3}, {0, 7}};
              // Constants for MD5 transform routine.
              const UINT32 S[4][4] = {
              { 7, 12, 17, 22 },
              { 5, 9, 14, 20 },
              { 4, 11, 16, 23 },
              { 6, 10, 15, 21 }
              };
              // F, G, H and I are basic MD5 functions.
              UINT32 F( UINT32 X, UINT32 Y, UINT32 Z )
              {
              return ( X & Y ) | ( ~X & Z );
              }
              UINT32 G( UINT32 X, UINT32 Y, UINT32 Z )
              {
              return ( X & Z ) | ( Y & ~Z );
              }
              UINT32 H( UINT32 X, UINT32 Y, UINT32 Z )
              {
              return X ^ Y ^ Z;
              }
              UINT32 I( UINT32 X, UINT32 Y, UINT32 Z )
              {
              return Y ^ ( X | ~Z );
              }
              // rotates x left s bits.
              UINT32 rotate_left( UINT32 x, UINT32 s )
              {
              return ( x << s ) | ( x >> ( 32 - s ) );
              }
              // Pre-processin
              UINT32 count_padding_bits ( UINT32 length )
              {
              UINT32 div = length * BITS / BLOCK_SIZE;
              UINT32 mod = length * BITS % BLOCK_SIZE;
              UINT32 c_bits;
              if ( mod == 0 )
              c_bits = MOD_SIZE;
              else
              c_bits = ( MOD_SIZE + BLOCK_SIZE - mod ) % BLOCK_SIZE;
              return c_bits / BITS;
              }
              STRING append_padding_bits ( char * argv )
              {
              UINT32 msg_length = strlen ( argv );
              UINT32 bit_length = count_padding_bits ( msg_length );
              UINT64 app_length = msg_length * BITS;
              STRING string;
              string.message = (char *)malloc(msg_length + bit_length + APP_SIZE / BITS);
              // Save message
              strncpy ( string.message, argv, msg_length );
              // Pad out to mod 64.
              memset ( string.message + msg_length, 0, bit_length );
              string.message [ msg_length ] = SINGLE_ONE_BIT;
              // Append length (before padding).
              memmove ( string.message + msg_length + bit_length, (char *)&app_length, sizeof( UINT64 ) );
              string.length = msg_length + bit_length + sizeof( UINT64 );
              return string;
              }
              int main ( int argc, char *argv[] )
              {
              STRING string;
              UINT32 w[16];
              UINT32 chain[4];
              UINT32 state[4];
              UINT8 r[16];
              UINT32 ( *auxi[ 4 ])( UINT32, UINT32, UINT32 ) = { F, G, H, I };
              int roundIdx;
              int argIdx;
              int sIdx;
              int wIdx;
              int i;
              int j;
              if ( argc < 2 )
              {
              fprintf ( stderr, "usage: %s string ...\n", argv[ 0 ] );
              return EXIT_FAILURE;
              }
              for ( argIdx = 1; argIdx < argc; argIdx++ )
              {
              string = append_padding_bits ( argv[ argIdx ] );
              // MD5 initialization.
              chain[0] = A;
              chain[1] = B;
              chain[2] = C;
              chain[3] = D;
              for ( j = 0; j < string.length; j += BLOCK_SIZE / BITS)
              {
              memmove ( (char *)w, string.message + j, BLOCK_SIZE / BITS );
              memmove ( state, chain, sizeof(chain) );
              for ( roundIdx = 0; roundIdx < 4; roundIdx++ )
              {
              wIdx = X[ roundIdx ][ 0 ];
              sIdx = 0;
              for ( i = 0; i < 16; i++ )
              {
              // FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
              // Rotation is separate from addition to prevent recomputation.
              state[sIdx] = state [ (sIdx + 1) % 4 ] +
              rotate_left ( state[sIdx] +
              ( *auxi[ roundIdx ] )
              ( state[(sIdx+1) % 4], state[(sIdx+2) % 4], state[(sIdx+3) % 4]) +
              w[ wIdx ] +
              (UINT32)floor( (1ULL << 32) * fabs(sin( roundIdx * 16 + i + 1 )) ),
              S[ roundIdx ][ i % 4 ]);
              sIdx = ( sIdx + 3 ) % 4;
              wIdx = ( wIdx + X[ roundIdx ][ 1 ] ) & 0xF;
              }
              }
              chain[ 0 ] += state[ 0 ];
              chain[ 1 ] += state[ 1 ];
              chain[ 2 ] += state[ 2 ];
              chain[ 3 ] += state[ 3 ];
              }
              memmove ( r + 0, (char *)&chain[0], sizeof(UINT32) );
              memmove ( r + 4, (char *)&chain[1], sizeof(UINT32) );
              memmove ( r + 8, (char *)&chain[2], sizeof(UINT32) );
              memmove ( r + 12, (char *)&chain[3], sizeof(UINT32) );
              for ( i = 0; i < 16; i++ )
              printf ( "%02x", r[i] );
              putchar ( '\n' );
              }
              return EXIT_SUCCESS;
              }
              /* 以上程序可以在任意一款支持ANSI C的編譯器上編譯通過 */
            热久久视久久精品18| 久久精品国产亚洲网站| 要久久爱在线免费观看| 久久婷婷五月综合成人D啪| 久久午夜福利无码1000合集| 亚洲国产精品无码久久SM| 99久久久精品| 久久久久亚洲精品日久生情| 久久亚洲AV成人无码电影| 精品国产乱码久久久久久浪潮| 综合久久精品色| 久久精品国产免费| 久久精品国产免费观看| 国产精品青草久久久久福利99| 亚洲精品无码成人片久久| 精品久久久久久久久久久久久久久| 久久亚洲AV无码精品色午夜麻豆 | 伊人色综合久久| 99久久99久久精品国产片果冻| 久久最近最新中文字幕大全| 国产亚洲美女精品久久久2020| 久久久久久狠狠丁香| 久久国产热精品波多野结衣AV| 久久夜色精品国产亚洲| 亚洲国产精品综合久久网络| 国产精品99久久久久久猫咪 | 亚洲中文字幕伊人久久无码 | 偷偷做久久久久网站| 国产福利电影一区二区三区,免费久久久久久久精| 一本一本久久a久久精品综合麻豆| 久久国产高清一区二区三区| 日本三级久久网| 久久亚洲中文字幕精品有坂深雪 | 久久久久久久97| 成人综合久久精品色婷婷| 香蕉aa三级久久毛片| 久久精品成人欧美大片| 四虎国产精品免费久久5151| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久久久亚洲av无码专区喷水 | 欧美精品福利视频一区二区三区久久久精品 |