I. 서론
MJH 해쉬 함수는 임의의 ε > 0에 대하여, O(2(1-ε)n)회의 질의까지 충돌 안전성이 보장된다는 것이 알려져 있다[3]. 따라서 거의 최적의 안전성을 제공하지만, 실제 사용되는 패러미터(예를 들어, n = 128)의 경우에는 안전성 상계에 곱해지는 상수의 영향을 무시하지 못하여 만족할 만한 수치를 제공하지는 못할 것으로 보인다.
역상 안전성의 경우, 한 개의 블록암호를 놓고 봤을 때, O(2n)회의 질의까지 역상 안전성이 보장된다는 것은 자명하다. 그러나 그 이상의 안전성에 대해서는 알려진 바가 없다.
한편, MDC-2에 대한 포괄적 충돌쌍 공격[3]이 MJH에 유사하게 적용된다는 것이 알려져 있으며[2], 예를 들어 n = 128 인 경우, 123.81 비트 수준의 공격이 가능하므로, 최적의 안전성 수준과 다소 격차가 있다고 볼 수 있다. 또한 O(23n/2)회의 질의로 역상을 찾을 수 있다는 것이 알려져 있으며, 이는 이상적인 2n 비트 해쉬 함수가 2n 비트의 역상 안전성을 제공해야 한다는 점을 감안할 때, 만족스럽지 못한 수준이라 하겠다. 본 과제에서는 이 공격을 더욱 개선시켜 O(n 2n)의 계산량과 같은 수준의 메모리를 요구하는 새로운 역상 공격을 제안한다.
II. MJH 압축 함수
먼저 MJH 해쉬 함수를 일반적인 블록 암호에 기반하는 운용 모드로서 정의하자. 이 운용 모드는 기반 블록 암호의 키 길이에 대하여 유연성을 제공한다. 구체적으로, 임의의 c≧0 에 대하여, n+c 비트 키를 사용하는 n 비트 블록 암호 E를 사용할 수 있다. 또한 MJH 해쉬 함수를 정의하기 위해서는 고정점을 갖지 않는 인볼루션(involution) σ 와 2n개의 원소를 갖는 유한체 GF(2n)의 원소로서 0 또는 1 이 아닌 상수 θ 가 주어져야 한다. 그러면 2n 비트 값을 연쇄 변수로 하여 n+c 비트 블록을 압축하는 함수 G[σ,θ]는 다음과 같이 정의된다. uL,uR,z1이 n 비트, z2가 c 비트 입력값일 때,
G[σ,θ] : {0,1}2n × {0,1}n+c → {0,1}2n
(uL||uR, z1||z2) ↦ (vL||vR)
이고, 여기서
vL = E(K,X) + X,
vR = θ·(E(K,σ(X))+σ(X))+X+z1,
다시 X = uL+z1, K = uR||z2 로 정의된다. Fig. 1을 참고하자.
Fig. 1. MJH Compression Function
안전성 증명을 위해서는 σ 가 고정점을 갖지 않는 인볼루션이라는 조건으로 충분하지만, 실제 구현 상에서는 0 아닌 상수의 덧셈(xor)로 충분할 것이다. 또한 상수 θ 역시 최대한 간단한 값으로 정하면 되는데, 예를 들어 (GF(2n)를 GF(2) 상에서의 n-1차 다항식으로 표현하고) θ = x 로 놓으면 이 상수에 의한 곱셈은 좌측 순환과 조건부 덧셈으로 표현될 것이다. 마지막으로 이 압축 함수는 Merkle-Damgard 방식으로 변환되어, 임의의 길이의 메시지를 입력으로 받는 해쉬 함수 MJH[σ,θ]가 된다.
III. 새로운 MJH 해쉬 함수 역상 공격
본 절에서는 MJH 해쉬함수에 대한 새로운 역상 공격을 제안한다. 공격은 다음과 같이 구성된다.
1) 블록암호 E 에 q = O(n 2n )회 질의하여 i = 1, …,q에 대하여 Eki (xi) = yi 을 만족하는 질의응답 쌍
Q = ((x1,k1,y1 ),…,(xq, kq,yq))
를 얻고, xi +yi = v를 만족하는 질의를 두 개 찾는다.
2) 목표 해쉬값 \(v^{*}=v_{L}^{*} \| v_{R}^{*}\)이 주어지면,
\(G[\sigma, \theta]\left(u_{L}^{*}\left\|u_{R}^{*}, z_{1}\right\| z_{2}\right)=v^{*}\)
을 만족하는 \(u_{L}^{*} \| u_{R}^{*}\)와 \(z_{1} \| z_{2}\)를 찾는다.
3) 중간 일치 기법을 적용하여, 고정된 IV를 사용하는 전체 해쉬함수에 대하여 목표 해쉬값의 역상을 구한다.
이제 이 공격을 분석하기 위하여, 공격의 첫 번째 단계가 성공적으로 수행됨을 증명하겠다. 즉, 이상적 블록암호(ideal block cipher) E 에 q = O(n 2n)회 질의하여 질의-응답 쌍 Q = ((x1,k1,y1 ),…,(xq, kq,yq))를 얻으면, 임의의 v∈{0,1}n에 대하여, xi +yi = v를 만족하는 질의의 개수가 언제나 두 개 이상임을 보이는 것이다.
먼저 N = 2n이라 하고, m > 1에 대하여 q = mN으로 쓰자. 또한 질의 방식을 보다 구체적으로 정의하자. 즉, m개의 서로 다른 키에 대하여, 모든 가능한 평문 x∈{0,1}n를 질의한다. 키가 고정된 블록암호는 랜덤 치환함수로 가정할 수 있는데, 고정된 키 k와 고정된 v∈{0,1}n에 대하여, x+Ek(x) = v를 만족하는 질의가 존재하지 않을 확률은 대략 1/e로 근사된다. 이렇게 되는 이유는, 키가 박혀있는 블록암호 Ek를 랜덤 치환함수 P로 놓고, Q(x) = v +P(x)라 하면, 위의 확률을 랜덤 치환함수 Q가 고정점을 갖는 확률로 이해할 수 있기 때문이다[1]. 따라서 m개의 서로 다른 키를 모두 사용한 경우에도 x +Ek(x) = v를 만족하는 질의가 존재하지 않을 확률은 1/em으로 근사된다. 비슷하게, x +Ek(x) = v를 만족하는 질의가 단 한 개 있을 확률은 m/em-1보다 크지 않다. 실제로 이 상계는 x +Ek(x) = v를 만족하는 질의가 단 한 개의 키에 대해서만 허용되는 경우의 확률에 대한 상계이다. 마지막으로 모든 가능한 v∈{0,1}n의 개수는 N이므로, 어떤 v∈{0,1}n에 대하여, xi +yi = v를 만족하는 질의의 개수가 한 개 이하인 확률은
\(N \cdot\left(\frac{1}{e^{m}}+\frac{m}{e^{m-1}}\right)\)
보다 크지 않다. 이때 m = 2n이라 놓으면, 위 값은 O(n/N)이 되어 무시할 수 있을만큼 작아지게 된다. 다시 얘기하면, 이 확률을 제외하면, 임의의 v∈{0,1}n에 대하여, xi +yi = v를 만족하는 질의의 개수가 언제나 두 개 이상이 된다.
다음으로 공격의 두번째 단계가 구체적으로 수행되는지 살펴보자. 목표 해쉬값 \(v^{*}=v_{L}^{*} \| v_{R}^{*}\)에 대하여
\(G[\sigma, \theta]\left(u_{L}^{*}\left\|u_{R}^{*}, z_{1}\right\| z_{2}\right)=v^{*}\)
을 만족하는 \(u_{L}^{*} \| u_{R}^{*}\)와 \(z_{1} \| z_{2}\)를 찾기 위하여 \(K=u_{R}^{*} \| z_{2}\)를 랜덤 값으로 고정하고, \(v_{L}^{*}=E(K, X)+X\)을 만족하는 X를 찾자. 그러면, \(X=u_{L}^{*}+z_{1}\)이고
\(v_{R}^{*}=\theta \cdot(E(K, \sigma(X))+\sigma(X))+X+z_{1}\)
이 되는 \(u_{L}^{*}\), \(z_{1}\)을 쉽게 찾을 수 있다. 이 작업에 드는 계산량은 대략 O(2n)이 된다. 그러나 만약 전체 해쉬 함수가 마지막 블록에 메시지의 길이 정보를 포함하는 패딩을 사용한다면, 이 계산량은 다소 늘어나게 된다. 예를 들어, c = 0, n = 128로서 각 메시지 블록이 128 비트라 하자. 그리고 마지막 메시지 블록의 끝에 64 비트의 메시지의 비트 길이 정보가 들어가고, 메시지의 끝과 길이 정보를 표현하는 64 비트 값 사이에 이진수열 10 ⋯ 0이 채워진다고 하자. 랜덤한 128 비트 블록 M을 64 비트 값 L을 사용하여 M = M′ 10 ⋯ 0L으로 표현할 때, 이 블록이 패딩된 메시지의 맨 마지막 블록이 될 수 있으려면, L이 결정하는 메시지의 길이를 128로 나눈 나머지가 M′의 길이가 되어야 한다. 이 확률은 1/128이 될 것이다. 추가적으로, L이 표현하는 길이가 n(n+c)보다 커야 하는데(이유는 뒤에 밝혀지겠지만), 대부분의 패러미터에서 랜덤한 64 비트 값 L 이 n(n+c)보다 작게 될 확률은 미미하므로 이 확률은 무시해도 좋다. 결론적으로, 목표 해쉬값의 역 상으로 맨 마지막 블록을 찾을 때에, 이 블록이 길이 n(n+c) 이상의 메시지의 패딩된 마지막 블록이 될 수 있도록 하려면, 대략 O((n+c)2n)의 계산량이 요구된다 하겠다.
이제 공격의 마지막 단계를 구체적으로 분석하자. 두번째 단계에서 찾은 \(u^{*}=u_{L}^{*} \| u_{R}^{*}\)과 첫 번째 단계에서 기록 및 정렬해 둔 질의-응답 목록 Q를 이용하여, u* 의 역상을 두 개 찾고, 다시 역상의 역상을 두 개씩 찾아서, 결과적으로 (1) u*를 조상 노드로 하고, (2) 깊이가 n이고, 잎사귀 노드의 개수가 2n이 되는 이진 균형 트리를 구성한다. Fig. 2를 참조하자.
Fig. 2. Binary Tree for Pre-images
이제 초기값 IV = IVL||IVR을 고정하고 마지막 블록에 포함된 길이 정보에 따라 적당한 개수의 메시지 블록을 임의로 적용하여, 중간 변수값 uL||uR을 계산한 후에, 여기에 다시 랜덤한 z1||z2값을 선택하여 G[σ,θ](uL||uR, z1 ||z2)의 값이 잎사귀 노드 가운데 하나와 같아지도록 한다. 중간 변수의 크기가 2n 비트이므로, 이 단계에서 요구되는 계산량은 O(2n)이 된다.
전체 계산량을 분석하면, 우리는 질의-응답 목록의 생성에 계산량 O(n 2n), 저장에 메모리 O(n 2n)을 사용하여 MJH의 목표 해쉬값에 대한 역상을 찾게 된다.
IV. 결론
본 논문에서 O(23n/2)회의 질의를 사용하는 기존 MJH 해쉬 함수 역상 공격을 개선하여, O(n 2n)의 계산량 및 이와 같은 수준의 메모리를 요구하는 새로운 역상 공격을 제안하였다. 본고에서 사용한 바와 같이 이진트리를 구성하여 역상을 찾는 공격이 다른 종류의 블록 암호 기반 해쉬 함수에도 적용되는지 살펴보는 것이 향후 흥미로운 연구 주제가 될 것으로 보인다.
* 이 논문은 2013년도 정부(교육부)의 재원으로 한국연구재단 의 지원을 받아 수행된 기초연구사업임(No. 2013R1A1A2 059864).
References
- M. Bona, "A Walk Through Combinatorics: An Introduction to Enumeration and Graph Theory," 3rd Edition, pp. 134-136, May 2006.
- D. Hong and D. Kwon, "Cryptanalysis of Double-Block-Length Hash Modes MDC-4 and MJH," IEICE Transactions on Fundamentals of Electronics, Communications and Computer Sciences, Vol. E97-A, No. 8, pp. 1747-1753, August 2014. https://doi.org/10.1587/transfun.E97.A.1747
- L. R. Knudsen, F. Mendel, C. Rechberger and S. S. Thomsen, "Cryptanalysis of MDC-2," Eurocrypt 2009, LNCS 5479, pp. 106-120, April 2009.
- J. Lee and M. Stam, "MJH: a faster alternative to MDC-2," Designs, Codes and Cryptography, Vol. 76. Issue 2. pp. 179-205, August 2015. https://doi.org/10.1007/s10623-014-9936-6