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

"RIPEMD-160"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
(알고리즘)
(알고리즘)
13번째 줄: 13번째 줄:
  
 
== 알고리즘 ==
 
== 알고리즘 ==
 +
[[파일:Ripemd_padding.png|썸네일|dh|350픽셀]]
  
 
===패딩===
 
===패딩===
[[파일:Ripemd_padding.png|썸네일|dh|350픽셀]]
 
 
 
메시지를 512비트의 배수로 패딩하고 바이트 스크림 입력을 32비트 워드로 패딩해야 한다. 길이 연장 공격을 방지하기 위해 Merkle-Damgorrd 강화법을 사용한 패딩 방식은 [[MD4]]와 동일하다.이는 메시지 끝에 추가되는 하나와 블록 끝에 추가되는 메시지 길이(비트 단위)로 구성된다.바이트는 먼저 low end라는 단어에 밀어 넣는다. 다음은 다른 메시지 길이에 대해 가능한 패턴을 보여주기 위해 단어에 패딩된 네 가지 메시지 예제이다. 그런 다음 메시지의 길이를 두 번째에서 마지막 요소까지 추가해야 한다.<ref name="RIPEMD160"></ref>  
 
메시지를 512비트의 배수로 패딩하고 바이트 스크림 입력을 32비트 워드로 패딩해야 한다. 길이 연장 공격을 방지하기 위해 Merkle-Damgorrd 강화법을 사용한 패딩 방식은 [[MD4]]와 동일하다.이는 메시지 끝에 추가되는 하나와 블록 끝에 추가되는 메시지 길이(비트 단위)로 구성된다.바이트는 먼저 low end라는 단어에 밀어 넣는다. 다음은 다른 메시지 길이에 대해 가능한 패턴을 보여주기 위해 단어에 패딩된 네 가지 메시지 예제이다. 그런 다음 메시지의 길이를 두 번째에서 마지막 요소까지 추가해야 한다.<ref name="RIPEMD160"></ref>  
  

2019년 7월 4일 (목) 13:11 판

RIPEMD-160은 머클-담골(Merkle-Damgård) 구축을 기반으로 하는 암호화 해시함수로, 주로 비트코인 표준에서 사용된다. 128비트 해시 다이제스트를 생성하는 RIPEMD 알고리즘의 강화 버전으로, RIPEMD-160 알고리즘은 160비트 출력을 생성한다. 다른 RIPEMD 버전과는 다르게, 어떤 특허에도 제약을 받지 않는 것으로 알려져 있다.[1]

등장배경

1996년, 기존의 RIPEMD에서 발견되는 보안적인 취약점에 대응하여 벨기에의 루벤에 위치한 뢰벤 카톨릭 대학(Katholieke Universiteit Leuven)의 코식(COSIC)연구 그룹의 한스 도버틴(Hans Dobbertin), 안톤 보슬라이어스(Antoon Bosselaers), 바트 프레닐(Bart Preenel)이 만든 보안 강화 버전이다.[2]

특징

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

알고리즘

dh

패딩

메시지를 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. 1.0 1.1 1.2 비트코인위키, 〈RIPEMD-160〉, 《비트코인위키》, 2014-06-30
  2. 2.0 2.1 jhh0712, 〈RIPEMD160 알고리즘〉, 《네이버 블로그》, 2019-02-10

참고자료

같이 보기


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