RIPEMD-160
RIPEMD-160은 Merkle-Damgård 구축을 기반으로 하는 암호화 해시함수로, 주로 비트코인 표준에서 사용된다. 128비트 해시 다이제스트를 생성하는 RIPEMD 알고리즘의 강화 버전으로, RIPEMD-160 알고리즘은 160비트 출력을 생성한다. 다른 RIPEMD 버전과는 다르게, 어떤 특허에도 제약을 받지 않는 것으로 알려져 있다.[1]
등장배경
1996년, 기존의 RIPEMD에서 발견되는 보안적인 취약점에 대응하여 벨기에의 루벤에 위치한 Katholieke UniversitLeuven의 COSIC연구 그룹의 Hans Dobbertin, Antoon Bosselaers, Bart Preenel이 만든 보안 강화 버전이다.[2]
특징
- 출력 길이 : 160 비트
- 입력 단위 : 512 비트
- 단계수 : 160(16번의 5병행 라운드)
- 최대 메시지 크기 : 2⁶⁴-1 비트
- 덧셈 상수 : 9
- Endianness : Little-endian
알고리즘
패딩
메시지를 512비트의 배수로 패딩하고 바이트 스크림 입력을 32비트 워드로 패딩해야 한다. 길이 연장 공격을 방지하기 위해 Merkle-Damgorrd 강화법을 사용한 패딩 방식은 MD4와 동일하다.이는 메시지 끝에 추가되는 하나와 블록 끝에 추가되는 메시지 길이(비트 단위)로 구성된다.바이트는 먼저 low end라는 단어에 밀어 넣는다. 다음은 다른 메시지 길이에 대해 가능한 패턴을 보여주기 위해 단어에 패딩된 네 가지 메시지 예제이다.
그런 다음 메시지의 길이를 두 번째에서 마지막 요소까지 추가해야 한다.[1]
압축함수
압축함수는 메시지 블록이 16회 전달되는 가변 서브 블록으로 구성된다. 총 80회 주행에는 5가지 다른 변형이 있다. 이 프로세스는 하단의 데이터 미팅에서 두 번 발생하여 다음 블록으로 이동하거나(있는 경우) 해시 레지스터에 추가되지 않는다. 하위 블록은 비선형 함수의 설계, 메시지 블록을 라운드별로 읽는 순서, 왼쪽 회전량과 k 상수에 따라 달라질 수 있다.[1]
X는 512비트 입력블록에서 파생된 32비트 워드 블록이다. 16개로 나누어 진다.
X배열의 인덱스 값인 r배열은 다음과 같이 정해져있다.
(X[r[i]], i=0~15)
left side {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, //Round 1 {7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8}, //Round 2 {3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12}, //Round 3 {1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2}, //Round 4 {4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13}} //Round 5
right side {{5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12}, //Round 1 {6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2}, //Round 2 {15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13}, //Round 3 {8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14}, //Round 4 {12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11}} //Round 5
K값은 정해져 있는 상수로 다음표와 같다.
kj left right K1 0x00000000 0x50a28be6 K2 0x5a827999 0x5c4dd124 K3 0x8f1bbcdc 0x7a6d76e9 K4 0xa953fd4e 0x00000000
shift rotate를 적용하는 배열 S값도 다음과 같이 정해져있다.
left side {{11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8}, //Round 1 {7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12}, //Round 2 {11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5}, //Round 3 {11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12}, //Round 4 {9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6}} //Round 5
right side {{8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6}, //Round 1 {9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11}, //Round 2 {9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5}, //Round 3 {15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8}, //Round 4 {8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11}}; //Round 5
여기서 비선형 함수는 다음과 같다. 총 16번의 step을 한 라운드씩 왼쪽 5번, 오른쪽 5번을 진행한다.
f1 : x ^ y ^ z
f2 : (x & y) | (~x & z)
f3 : (x | ~y) ^ z
f4 : (x & z) | (y & ~z)
f5 : x ^ (y | ~z)
#define F1 (x , y , z) (x ^ y ^ z) #define F2 (x , y , z) ((x & y) | (~x & z)) #define F3 (x , y , z) ((x | ~y) ^ z) #define F4 (x , y , z) ((x & z) | (y & ~z)) #define F5 (x , y , z) (x ^ (y | ~z))
왼쪽은 f1~5순, 오른쪽은 f5~1순으로 연산된다. 왼쪽, 오른쪽 5번씩 라운드가 진행된다.[2]
각주
- ↑ 1.0 1.1 1.2 bitcoinwiki, 〈RIPEMD-160〉, 《비트코인위키》, 2014-06-30
- ↑ 2.0 2.1 jhh0712, 〈RIPEMD160 알고리즘〉, 《네이버 블로그》, 2019-02-10
참고자료
- bitcoinwiki, 〈RIPEMD-160〉, 《비트코인위키》, 2014-06-30
- jhh0712, 〈RIPEMD160 알고리즘〉, 《네이버 블로그》, 2019-02-10
같이 보기
|