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

위키원
이동: 둘러보기, 검색
1번째 줄: 1번째 줄:
 
== 개요 ==
 
== 개요 ==
  
RIPEMD-160은 Merkle-Damgård 구축을 기반으로하는 암호화 해시 함수로, 주로 [[Bitcoin]]표준에서 사용된다.128 비트 해시 다이제스트를 생성하는 [[RIPEMD]] 알고리즘의 강화 버전으로, RIPEMD-160알고리즘은 160비트 출력을 생성한다. 다른 [[RIPEMD]]버전과는 다르게 어떤 특허에도 제약을 받지 않는 것으로 알려져있다.<ref>댕이댕이, 〈[https://m.blog.naver.com/PostView.nhn?blogId=stop2y&logNo=221158642741&proxyReferer=https%3A%2F%2Fwww.google.com%2F RIPEMD 비트코인 /알고리즘/ 공격 기법/ 사용 현황]〉, 《네이버 블로그》 , 2017-12-08</ref>
+
RIPEMD-160은 Merkle-Damgård 구축을 기반으로하는 암호화 해시 함수로, 주로 [[Bitcoin]]표준에서 사용된다.128 비트 해시 다이제스트를 생성하는 [[RIPEMD]] 알고리즘의 강화 버전으로, RIPEMD-160알고리즘은 160비트 출력을 생성한다. 다른 [[RIPEMD]]버전과는 다르게 어떤 특허에도 제약을 받지 않는 것으로 알려져있다.<ref name="RIPEMD160 알고리즘">bitcoinwiki, 〈[https://en.bitcoin.it/wiki/RIPEMD-160 RIPEMD-160]〉, 《bitcoinwiki》, 2014-06-30</ref>  
  
 
== 등장배경 ==
 
== 등장배경 ==
  
1996년, 기존의 [[RIPEMD]]에서 발견되는 보안적인 취약점에 대응하여 벨기에의 루벤에 위치한 Katholieke UniversitLeuven의 COSIC연구 그룹의 Hans Dobbertin, Antoon Bosselaers, Bart Preenel이 만든 보안 강화 버전이다.  
+
1996년, 기존의 [[RIPEMD]]에서 발견되는 보안적인 취약점에 대응하여 벨기에의 루벤에 위치한 Katholieke UniversitLeuven의 COSIC연구 그룹의 Hans Dobbertin, Antoon Bosselaers, Bart Preenel이 만든 보안 강화 버전이다.<ref name="RIPEMD 알고리즘"></ref>
  
 
== 알고리즘 ==
 
== 알고리즘 ==
15번째 줄: 15번째 줄:
 
[[파일:Ripemd_padding.png|썸네일|가운데|350픽셀]]
 
[[파일:Ripemd_padding.png|썸네일|가운데|350픽셀]]
  
그런 다음 메시지의 길이를 두 번째에서 마지막 요소까지 추가해야 한다.
+
그런 다음 메시지의 길이를 두 번째에서 마지막 요소까지 추가해야 한다.<ref name="RIPEMD160 알고리즘">bitcoinwiki, 〈[https://en.bitcoin.it/wiki/RIPEMD-160 RIPEMD-160]〉, 《bitcoinwiki》, 2014-06-30</ref>
 +
 
  
 
=== 압축함수 ===
 
=== 압축함수 ===
  
[[파일:RIPEMD160_block.png|썸네일|400픽셀|압축 기능의 서브 블록]]
+
[[파일:RIPEMD.png|썸네일|400픽셀|압축 기능의 서브 블록]]
 
 
압축함수는 메시지 블록이 16회 전달되는 가변 서브 블록으로 구성된다. 총 80회 주행에는 5가지 다른 변형이 있다. 이 프로세스는 하단의 데이터 미팅에서 두 번 발생하여 다음 블록으로 이동하거나(있는 경우) 해시 레지스터에 추가되지 않는다. 하위 블록은 비선형 함수의 설계, 메시지 블록을 라운드별로 읽는 순서, 왼쪽 회전량과 k 상수에 따라 달라질 수 있다.
 
 
 
 
 
 
 
  
 +
압축함수는 메시지 블록이 16회 전달되는 가변 서브 블록으로 구성된다. 총 80회 주행에는 5가지 다른 변형이 있다. 이 프로세스는 하단의 데이터 미팅에서 두 번 발생하여 다음 블록으로 이동하거나(있는 경우) 해시 레지스터에 추가되지 않는다. 하위 블록은 비선형 함수의 설계, 메시지 블록을 라운드별로 읽는 순서, 왼쪽 회전량과 k 상수에 따라 달라질 수 있다.<ref name="RIPEMD160 알고리즘"></ref>
  
  
33번째 줄: 30번째 줄:
 
(X[r[i]], i=0~15)
 
(X[r[i]], i=0~15)
 
  left side
 
  left side
  {{0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15}, //Round 1
+
  {{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값은 정해져 있는 상수로 다음표와 같다.
 +
:{|class=wikitable width=600
 +
|+
 +
!align=center|kj
 +
!align=center|left
 +
!align=center|right
 +
|-
 +
|align=center|K1
 +
|align=center|0x00000000
 +
|align=center|0x50a28be6
 +
|-
 +
|align=center|K2
 +
|align=center|0x5a827999
 +
|align=center|0x5c4dd124
 +
|-
 +
|align=center|K3
 +
|align=center|0x8f1bbcdc
 +
|align=center|0x7a6d76e9
 +
|-
 +
|align=center|K4
 +
|align=center|0xa953fd4e
 +
|align=center|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
  
  
82번째 줄: 103번째 줄:
 
  #define F5 (x , y , z) (x ^ (y | ~z))
 
  #define F5 (x , y , z) (x ^ (y | ~z))
  
왼쪽은 f1~5순, 오른쪽은 f5~1순으로 연산된다. 왼쪽, 오른쪽 5번씩 라운드가 진행된다.
+
왼쪽은 f1~5순, 오른쪽은 f5~1순으로 연산된다. 왼쪽, 오른쪽 5번씩 라운드가 진행된다.<ref name="RIPEMD 알고리즘"></ref>
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
  
 
{{각주}}
 
{{각주}}

2019년 7월 2일 (화) 16:10 판

개요

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

등장배경

1996년, 기존의 RIPEMD에서 발견되는 보안적인 취약점에 대응하여 벨기에의 루벤에 위치한 Katholieke UniversitLeuven의 COSIC연구 그룹의 Hans Dobbertin, Antoon Bosselaers, Bart Preenel이 만든 보안 강화 버전이다.[2]

알고리즘

패딩

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

Ripemd padding.png

그런 다음 메시지의 길이를 두 번째에서 마지막 요소까지 추가해야 한다.[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 bitcoinwiki, 〈RIPEMD-160〉, 《bitcoinwiki》, 2014-06-30
  2. 2.0 2.1 인용 오류: <ref> 태그가 잘못되었습니다; RIPEMD_.EC.95.8C.EA.B3.A0.EB.A6.AC.EC.A6.98라는 이름을 가진 주석에 제공한 텍스트가 없습니다

참고 자료