HMACSHA 256 원리 분석
3067 단어 경험 을 총화 하 다
목표 플랫폼 에 이식 하여 테스트 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
springboot 연결 mysql 오류 발생 원인: java. sql. SQLexception: The server time zone value 'й���ʱ��' is unrespringboot 연결 my sql 오 류 는 다음 과 같 습 니 다. Caused by: java.sql.SQLException: The server time zone value ‘�й���ʱ��’ is unr...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.