검수요청.png검수요청.png

RIPEMD-160

위키원
이동: 둘러보기, 검색

RIPEMD-160은 임의의 길이의 입력 값을 160비트로 압축하는 암호화 해시함수이다. RIPEMD-128의 강화버전이며 주로 비트코인 표준에서 사용된다.

개요

RIPEMD-160의 개발은 유럽의 RIPE(RACE Integrity Primitives Evaluation) 프로젝트 주관 하에 MD4MD5의 취약점을 분석했던 연구 그룹이 주도하였다. 이때 128비트의 RIPEMD을 개발했다. 그러나 1996년 뢰벤카톨릭대학교(Katholieke Universiteit Leuven) 코식(COSIC)연구 그룹의 한스 도버틴(Hans Dobbertin)은 RIPEMD-128에 대한 해독 가능성을 지적한 후, RIPE 개발 그룹에서는 한스 도버틴을 직접 참여시켜 160비트 해시함수인 RIPEMD-160을 다시 개발했다.[1] 이것이 바로 RIPEMD-160이다. RIPEMD-160은 지금까지 알려진 공격들을 고려하여 출력 길이를 160비트로, 라운드 수를 5라운드로 늘리고 메시지 입력순서, 순환이동의 양, 부울 함수(boolean function)의 적용순서 등을 수정하여 기존의 RIPEMD를 강화하였다.

RIPEMD-160이 발표될 당시, ISO 표준으로 채택된 RIPEMD가 많은 응용분야에서 사용되고 있었으므로 이것을 RIPEMD-160으로 대체하면 많은 부분을 수정해야 하기 때문에 출력 길이가 RIPEMD와 같은 RIPEMD-128이 함께 발표되었다. RIPEMD-160는 임의의 길이의 입력 값을 160비트로 압축하는 함수로 입력 값은 512비트 단위로 처리한다. 입력 값은 처리되기 전에 512비트의 배수가 되도록 패딩되어야 하는데 패딩 규칙은 SHA-1과 동일하며 다른 RIPEMD 버전과는 다르게, 어떤 특허에도 제약을 받지 않는 것으로 알려져 있다.[2]

  • 출력 길이 : 160 비트
  • 입력 단위 : 512 비트
  • 단계수 : 160(16번의 5병행 라운드)
  • 최대 메시지 크기 : 2⁶⁴-1 비트
  • 덧셈 상수 : 9
  • Endianness : Little-endian

알고리즘

Ripemd padding.png

패딩

메시지를 512비트의 배수로 패딩하고 바이트 스크림 입력을 32비트 워드로 패딩해야 한다. 길이 연장 공격을 방지하기 위해 Merkle-Damgorrd 강화법을 사용한 패딩 방식은 MD4와 동일하다.이는 메시지 끝에 추가되는 하나와 블록 끝에 추가되는 메시지 길이(비트 단위)로 구성된다. 바이트는 먼저 low end라는 단어에 밀어 넣는다.

우측 표는 다른 메시지 길이에 대해 가능한 패턴을 보여주기 위해 단어에 패딩된 네 가지 메시지 예제이다. 그런 다음 메시지의 길이를 두 번째에서 마지막 요소까지 추가해야 한다.[2]

압축함수

압축함수는 메시지 블록이 16회 전달되는 가변 서브 블록으로 구성된다. 총 80회 주행에는 5가지 다른 변형이 있다. 이 프로세스는 하단의 데이터 미팅에서 두 번 발생하여 다음 블록으로 이동하거나(있는 경우) 해시 레지스터에 추가되지 않는다. 하위 블록은 비선형 함수의 설계, 메시지 블록을 라운드별로 읽는 순서, 왼쪽 회전량과 k 상수에 따라 달라질 수 있다.[2]

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번씩 라운드가 진행된다.[1]

각주

  1. 1.0 1.1 jhh0712, 〈RIPEMD160 알고리즘〉, 《네이버 블로그》, 2019-02-10
  2. 2.0 2.1 2.2 비트코인위키, 〈RIPEMD-160〉, 《비트코인위키》, 2014-06-30

참고자료

같이 보기


  검수요청.png검수요청.png 이 RIPEMD-160 문서는 암호 알고리즘에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.