금 산 쾌속 반 개발 (4)

26896 단어 금 산개발 하 다.
오늘 은 동료 들 에 게 불평 을 했 습 니 다. 저 는 그동안 참 았 습 니 다. 오늘 은 말 을 많이 했 습 니 다. 그리고 많은 것 을 얻 었 습 니 다. 동 료 는 "당신 이 현재 상황 에 만족 하지 않 는 이상 왜 행동 하지 않 습 니까?" 라 고 말 해서 단번에 저 를 그 자리 에 멍 하 게 만 들 었 습 니 다.그래, 내 가 왜 불평 을 해, 왜 움 직 이지 않 는 거 야?
                                                    --------오늘 은 바 뀐 날
일 을 할 때 는 반드시 잘 해 야 한다. 싫 지 않 은 것 은 하지 않 는 것 보다 시간 을 낭비 하고 감정 을 낭비 하 며 지구의 회전 을 방해한다.
      어제 base 64 인 코딩 코드 를 보 냈 는데 오늘 알고리즘 코드 hmac - sha 1 코드 를 붙 였 습 니 다.
  관례, 헤더 파일:
   
   
   
   
  1. #ifndef __HMAC_SHA1__ 
  2. #define __HMAC_SHA1__ 
  3.  
  4. /* Function to compute the digest */ 
  5. char* hmac_sha( 
  6.     char* k, /* secret key */ 
  7.     int lk, /* length of the key in bytes */ 
  8.     char* d, /* data */ 
  9.     int ld, /* length of data in bytes */ 
  10.     char* out, /* output buffer, at least "t" bytes */ 
  11.     int t 
  12. ); 
  13.  
  14. #endif 

그리고 실현:
 
   
   
   
   
  1. #include "sha1.h" 
  2. //#include "base64.h" 
  3.  
  4. #include  
  5. #include  
  6. #include  
  7.  
  8. #include  
  9.  
  10. #ifndef SHA_DIGESTSIZE 
  11. #define SHA_DIGESTSIZE 20 
  12. #endif 
  13.  
  14. #ifndef SHA_BLOCKSIZE 
  15. #define SHA_BLOCKSIZE 64 
  16. #endif 
  17.  
  18. extern char* base64_encode(const char* data, int data_len);  
  19. /* Hash a single 512-bit block. This is the core of the algorithm. */ 
  20.  
  21. void SHA1Transform(__u32 state[5], __u8 buffer[64]) 
  22. { 
  23. __u32 a, b, c, d, e; 
  24. typedef union { 
  25.     unsigned char c[64]; 
  26.     __u32 l[16]; 
  27. } CHAR64LONG16; 
  28.  
  29. CHAR64LONG16* block; 
  30.  
  31. #ifdef SHA1HANDSOFF 
  32.  
  33. static unsigned char workspace[64]; 
  34.     block = (CHAR64LONG16*)workspace; 
  35. //    NdisMoveMemory(block, buffer, 64); 
  36.     memcpy(block, buffer, 64); 
  37. #else 
  38.     block = (CHAR64LONG16*)buffer; 
  39. #endif 
  40.     /* Copy context->state[] to working vars */ 
  41.     a = state[0]; 
  42.     b = state[1]; 
  43.     c = state[2]; 
  44.     d = state[3]; 
  45.     e = state[4]; 
  46.     /* 4 rounds of 20 operations each. Loop unrolled. */ 
  47.     R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); 
  48.     R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); 
  49.     R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); 
  50.     R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); 
  51.     R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); 
  52.     R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); 
  53.     R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); 
  54.     R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); 
  55.     R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); 
  56.     R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); 
  57.     R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); 
  58.     R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); 
  59.     R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); 
  60.     R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); 
  61.     R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); 
  62.     R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); 
  63.     R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); 
  64.     R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); 
  65.     R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); 
  66.     R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); 
  67.     /* Add the working vars back into context.state[] */ 
  68.     state[0] += a; 
  69.     state[1] += b; 
  70.     state[2] += c; 
  71.     state[3] += d; 
  72.     state[4] += e; 
  73.     /* Wipe variables */ 
  74.     a = b = c = d = e = 0; 
  75. } 
  76.  
  77.  
  78. /* SHA1Init - Initialize new context */ 
  79.  
  80. void SHA1Init(SHA1_CTX* context) 
  81. { 
  82.     /* SHA1 initialization constants */ 
  83.     context->state[0] = 0x67452301; 
  84.     context->state[1] = 0xEFCDAB89; 
  85.     context->state[2] = 0x98BADCFE; 
  86.     context->state[3] = 0x10325476; 
  87.     context->state[4] = 0xC3D2E1F0; 
  88.     context->count[0] = context->count[1] = 0; 
  89. } 
  90.  
  91.  
  92. /* Run your data through this. */ 
  93.  
  94. void SHA1Update(SHA1_CTX* context, unsigned char* data, __u32 len) 
  95. { 
  96.     __u32 i, j; 
  97.  
  98.     j = context->count[0]; 
  99.     if ((context->count[0] += len <
  100.     context->count[1]++; 
  101.     context->count[1] += (len>>29); 
  102.     j = (j >> 3) & 63; 
  103.     if ((j + len) > 63) { 
  104. //        NdisMoveMemory(&context->buffer[j], data, (i = 64-j)); 
  105.         memcpy(&context->buffer[j], data, (i = 64-j)); 
  106.         SHA1Transform(context->state, context->buffer); 
  107.         for ( ; i + 63 
  108.             SHA1Transform(context->state, &data[i]); 
  109.         } 
  110.         j = 0; 
  111.     } 
  112.     else i = 0; 
  113. //    NdisMoveMemory(&context->buffer[j], &data[i], len - i); 
  114.     memcpy(&context->buffer[j], &data[i], len - i); 
  115. } 
  116.  
  117.  
  118. /* Add padding and return the message digest. */ 
  119.  
  120. void SHA1Final(unsigned char digest[20], SHA1_CTX* context) 
  121. { 
  122. __u32 i, j; 
  123. unsigned char finalcount[8]; 
  124.  
  125.     for (i = 0; i 
  126.         finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] 
  127.          >> ((3-(i & 3)) * 8) ) & 255);  /* Endian independent */ 
  128.     } 
  129.     SHA1Update(context, (unsigned char *)"\200", 1); 
  130.     while ((context->count[0] & 504) != 448) { 
  131.         SHA1Update(context, (unsigned char *)"\0", 1); 
  132.     } 
  133.     SHA1Update(context, finalcount, 8);  /* Should cause a SHA1Transform() */ 
  134.     for (i = 0; i 
  135.         digest[i] = (unsigned char) 
  136.          ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); 
  137.     } 
  138.     /* Wipe variables */ 
  139.     i = j = 0; 
  140. //    NdisZeroMemory(context->buffer, 64); 
  141. //    NdisZeroMemory(context->state, 20); 
  142. //    NdisZeroMemory(context->count, 8); 
  143. //    NdisZeroMemory(&finalcount, 8); 
  144.     memset(context->buffer, 0x00, 64); 
  145.     memset(context->state, 0x00, 20); 
  146.     memset(context->count, 0x00, 8); 
  147.     memset(&finalcount, 0x00, 8); 
  148.      
  149. #ifdef SHA1HANDSOFF  /* make SHA1Transform overwrite its own static vars */ 
  150.     SHA1Transform(context->state, context->buffer); 
  151. #endif 
  152. } 
  153.  
  154.  
  155.  
  156. /* Function to print the digest */ 
  157. void pr_sha(FILE* fp, unsigned char* s, int t) 
  158. { 
  159.     int i ; 
  160.     /* 
  161.     for(i=0;i 
  162.         printf("%02x",s[i]);     
  163.     printf("
    ");
     
  164.     */ 
  165.     printf("digest:%s
    "
    ,s); 
  166.     /* 
  167.     fprintf(fp, "0x") ; 
  168.     for (i = 0 ; i  
  169.     { 
  170.         fprintf(fp, "%02x", s[i]) ; 
  171.         printf("
    ");
     
  172.     } 
  173.     fprintf(fp, "0") ; 
  174.     */ 
  175. } 
  176.  
  177. void truncate_m 
  178. ( 
  179.     char* d1, /* data to be truncate_md */ 
  180.     char* d2, /* truncate_md data */ 
  181.     int len /* length in bytes to keep */ 
  182. ) 
  183. { 
  184.     int i ; 
  185.     for (i = 0 ; i 
  186. } 
  187.  
  188. /* Function to compute the digest */ 
  189. char* hmac_sha 
  190. ( 
  191.     char* k, /* secret key */ 
  192.     int lk, /* length of the key in bytes */ 
  193.     char* d, /* data */ 
  194.     int ld, /* length of data in bytes */ 
  195.     char* out, /* output buffer, at least "t" bytes */ 
  196.     int t 
  197. ) 
  198. { 
  199.     SHA1_CTX ictx, octx ; 
  200.     char isha[SHA_DIGESTSIZE], osha[SHA_DIGESTSIZE] ; 
  201.     char key[SHA_DIGESTSIZE] ; 
  202.     char buf[SHA_BLOCKSIZE] ; 
  203.     int i ; 
  204.  
  205.     if (lk > SHA_BLOCKSIZE) { 
  206.  
  207.     SHA1_CTX tctx ; 
  208.  
  209.     SHA1Init(&tctx) ; 
  210.     SHA1Update(&tctx, k, lk) ; 
  211.     SHA1Final(key, &tctx) ; 
  212.  
  213.     k = key ; 
  214.     lk = SHA_DIGESTSIZE ; 
  215. } 
  216.  
  217. /**** Inner Digest ****/ 
  218.  
  219.     SHA1Init(&ictx) ; 
  220.  
  221.     /* Pad the key for inner digest */ 
  222.     for (i = 0 ; i 
  223.     for (i = lk ; i 
  224.  
  225.     SHA1Update(&ictx, buf, SHA_BLOCKSIZE) ; 
  226.     SHA1Update(&ictx, d, ld) ; 
  227.  
  228.     SHA1Final(isha, &ictx) ; 
  229.  
  230. /**** Outter Digest ****/ 
  231.  
  232.     SHA1Init(&octx) ; 
  233.  
  234. /* Pad the key for outter digest */ 
  235.  
  236.     for (i = 0 ; i 
  237.     for (i = lk ; i 
  238.  
  239.     SHA1Update(&octx, buf, SHA_BLOCKSIZE) ; 
  240.     SHA1Update(&octx, isha, SHA_DIGESTSIZE) ; 
  241.  
  242.     SHA1Final(osha, &octx) ; 
  243.  
  244. /* truncate_m and print the results */ 
  245.     t = t > SHA_DIGESTSIZE ? SHA_DIGESTSIZE : t ; 
  246.     truncate_m(osha, out, t) ; 
  247.     //pr_sha(stdout, out, t) ; 
  248.     return out; 
  249.     //printf("%s
    ",base64_encode(out,t));
     
  250.  
  251. } 

자, 이상 의 코드 는 모두 테스트 를 한 것 이 고 알고리즘 문 제 는 현재 연구 할 시간 이 없습니다.

좋은 웹페이지 즐겨찾기