HMACSHA 256 원리 분석

HMACSHA 256 알고리즘 을 지원 해 야 합 니 다.GitHub 에서 원본 코드 의 구체 적 인 주 소 를 찾 습 니 다.https://github.com/aperezdc/hmac-sha256/blob/master/hmac-sha256.c
목표 플랫폼 에 이식 하여 테스트 ok 을 약간 처리 하 였 습 니 다.원리:
1.키 키 키 와 고정된 데이터(0x 36)를 입력 하여 64B 의 데이터 kx 를 만 들 거나 조작 합 니 다.
2.kx+입력 데 이 터 를 사용 하여 sha 256 알고리즘 을 실행 하여 32B 의 out 을 얻 습 니 다.
3.키 키 키 와 고정된 데이터(0x5C)를 사용 하여 64B 의 데이터 kx 를 만 들 거나 조작 합 니 다.
4.kx'+2 단계 로 생 성 된 out 을 사용 하여 sha 256 알고리즘 을 실행 하여 32B 의 out 을 얻 었 습 니 다.이 결 과 는 HMACSHA 256 알고리즘 출력 입 니 다.
  :HMAC                           .                   ,         、       .

#ifndef HMAC_SHA256_H #define HMAC_SHA256_H     #define B 64     #define I_PAD 0x36 #define O_PAD 0x5C         #define HMAC_SHA256_DIGEST_SIZE 32  /* Same as SHA-256's output size. */ #define SHA256_DIGEST_SIZE 32          #endif /* !HMAC_SHA256_H */ void hmac_sha256 (const u8 *key, u32 key_len,const u8 *data, u32 data_len,u8 *out) {      u16 i;     u8 kh[SHA256_DIGEST_SIZE];     u8 tmpdata[1024];       if (key_len>B){//key 길이 가 64B 이상 이면 먼저 key 에 대해 sha 256 연산 을 하고 32B 데이터 로 바 꿔 야 합 니 다.그렇지 않 으 면 처리 하지 않 습 니 다.                sha256( key, key_len, kh);         key_len = SHA256_DIGEST_SIZE;         key = kh;     }
    /*      * (1) append zeros to the end of K to create a B byte string      *     (e.g., if K is of length 20 bytes and B=64, then K will be      *     appended with 44 zero bytes 0x00)      * (2) XOR (bitwise exclusive-OR) the B byte string computed in step      *     (1) with ipad      */     u8 kx[B];     for ( i = 0; i < key_len; i++) kx[i] = I_PAD ^ key[i];//key 이상 또는 0x 36,앞부분 kx 채 우기    for ( i = key_len; i < B; i++) kx[i] = I_PAD ^ 0;//나머지 부분 은 0x 36 를 채 워 서 kx 데 이 터 를 생 성 합 니 다.
    /*      * (3) append the stream of data 'text' to the B byte string resulting      *     from step (2)      * (4) apply H to the stream generated in step (3)      */       memcpy(tmpdata,kx,B);     memcpy(&tmpdata[B],data,data_len);     sha256(tmpdata, key_len+B, out);//kx 와 입력 데 이 터 를 연결 하여 sha 256 을 계산 합 니 다.
    /*      * (5) XOR (bitwise exclusive-OR) the B byte string computed in      *     step (1) with opad      * NOTE: The "kx" variable is reused.      */     for ( i = 0; i < key_len; i++) kx[i] = O_PAD ^ key[i];//key 이상 또는 0x5C,앞부분 kx 채 우기    for ( i = key_len; i < B; i++) kx[i] = O_PAD ^ 0;//나머지 부분 은 0x5C 를 채 워 kx 데 이 터 를 생 성 합 니 다.
    /*      * (6) append the H result from step (4) to the B byte string      *     resulting from step (5)      * (7) apply H to the stream generated in step (6) and output      *     the result      */
    memcpy(tmpdata,kx,B);     memcpy(&tmpdata[B],out,SHA256_DIGEST_SIZE);     sha256(tmpdata, SHA256_DIGEST_SIZE+B, out);//kx 와 이전 단계 에 생 성 된 32B 데 이 터 를 연결 하여 sha 256,출력 결 과 를 한 번 더 계산 합 니 다.}
 
테스트 데이터:key 1(32B hex)
key3(16B hex):0102030405060708090a0b0c0d0e0f10 data3(40B ascll):1234567890123456789012345678901234567890 value3(32B hex):17E016631C53E274CA1B6403967AEA1A36E3D1C726588C1668CD1F93A7D9D8A7

좋은 웹페이지 즐겨찾기