Ⅰ. 서론
공개키 방식 암호 시스템은 단순히 데이터의 암호화에 사용되는 비밀키 암호 시스템과는 달리 전자서명 및 인증 기능까지 갖추고 있는데, 최근 늘어나는 전자상거래에서 인증 수단으로 그 수요가 급증하고 있다. 그 중 대표적인 것이 1978년에 R.L. Rivest, A. Shamir, L. Adleman에 의해서 제안된 RSA 알고리즘이며, 본 논문은 RSA 알고리즘의 기본연산인 모듈로 멱승연산을 효율적으로 처리하기 위한 하드웨어 구현에 관한 연구이다.
RSA 알고리즘은 큰 정수 계수 MModulus) 의소인수 분해가 매우 어려움에 그 안전성의 근거를 두고 있는데, 보안성을 높이기 위해 1024비트 이상의 큰 정수(key)를 기반으로 한 모듈로 멱승 연산을 수행해야만 한다. 모듈로 멱승 연산은 내부에 곱셈과 나눗셈이 복합되어 있어 계산 구조가 복잡하고 워드 사이즈가 크기 때문에 소프트웨어로 구현할 경우 상당한 처리시간이 필요하다. 때문에 최근 하드웨어 구현에 관한 다양한 연산 알고리즘들이 연구되어 고속 RSA모듈 구현에 대한 관심과 연구가 활발해지고 있으며, 하드웨어로 구현했을 경우에는 속도뿐만 아니라 키의 안전성 면에서도 소프트웨어보다 월등하다는 장점을 가진다.
본 논문에서는 이러한 속도 향상을 위한 연구로서. 최근 발표된 새로운 멱승 방법인 나눗셈 체인을 이용한 멱승(2)을 효율적으로 처리하기 위한 새로운 하드웨어 구조를 제안하였다.
모듈로 멱승 연산 방법들 중, Binary method13~51 는 지수 E의 이진 비트열을 스캔해 가면서 제곱과 곱셈을 반복적으로 수행하면 되기 때문에 하드웨어구현 시 컨트롤을 간단히 처리해 줄 수 있는 장점이 있어 일반적으로 많이 사용한다. 하지만 전체 멱 승 시 필요한 곱셈의 횟수는 평균(3/2)log2E 번이며, 하드웨어 구현 시에는 worst-case를 보장하도록 설계되어야 하기 때문에 21ogzE 번의 곱셈이 필요하다.'또 M-ary Method는 E의 비트열을 여러 비트씩 묶어서 한번에 계산하는 방법으로 곱셈의 횟수를 현격히 줄일 수 있다. 하지만 묶여진 비트열의 값이 어떤 값이 될지 알 수 없기 때문에 발생할 수 있는 모든 경우의 값을 저장하고 있어야 한다. 이러한 이유로 많은 하드웨어 리소스 차지하는 단점을 가진다.(4)
본 논문에서 적용한 나눗셈 체인(Division chain) 은지수 E를 임의의 제수 d와 나머지 r의 합으로 표현하는데, re d를 구해 가는 과정에서 얻어질 수 있는 값이 되도록 하여구하는데 필요한 계산량을 줄임으로써 곱셈의 횟수를 줄이는 방법이다. 본 논문에서는 나눗셈 체인을 하드웨어로 처리하기에 적합하도록 변형하였고, 또 이를 위한 하드웨어 구조를 제시하였다.
곱셈기의 전체 구조는 몽고메리 알고리즘을 이용한 시스톨릭 어레이 구조로 설계하였다. 이때 DG (Dependence Graph)를 수직으로 매핑할 경우 나눗셈 체인의 적용으로 인해 처리율 50% 밖에 이룰 수가 없다. 따라서 수평 매핑방법을 적용하여, k/2+3 개의 PE (Processing Element) 만으로 k 비트 RSA 연산이 가능하도록 하였다. 이로써 두 개의 곱셈기모듈이 두 개의 k 비트 프레임을 병렬로 동시에 처리하도록 함으로써 k+6 개의 PE로 100% 처리율을 이룰 수 있도록 하였다. 또 복호화 과정은 수신자가 계수 N의 인수인 p와 q를 알고 있으므로CRT (Chinese Remainder Theorem)의 적용이 가능하다. 본 논문에서는 이의 적용을 위해 두 개의 독립된 곱셈기 모듈이 인터리빙을 이용해 4개의 k/2 비트 암호문을 교대로 처리 할 수 있도록 하였다. 이렇게 함으로써 암호화 시 임의의 k 비트 E 값을 사용하였을 경우보다 4배의 처리속도를 향상시킬 수 있다.
암호화 시에 사용하는 지수 E 값은 공개키이므로 , =3, 17 혹은 2 + 1와 같이 충분히 작은 값을 사용하여도 보안상에는 문제가 되지 않으면서 처리속도를 빠르게 할 수 있다. 또 암호화 과정은 디지털 서명의 검증과정으로 사용되기도 하기 때문에 빠른 처리속도는 필수적이라 할 수 있다. 따라서 디지털 서명은 한번 만들어 두면 반복적으로 사용할 수 있기 때문에 그것의 생성에는 시간이 걸리더라도, 검증과정에서 앞서 언급한 E 값들을 사용하도록 하여 실시간 응답에 대한 요구를 충분히 만족시킬 수 있도록 하였다.
본 논문의 구성은 2장에서 기존의 구현 예들을 살펴보고 그에 따른 장단점에 대해 검토하였으며 3장에서 RSA 알고리즘 및 하드웨어 구현에 따른 성능개선 방법과 본 논문에서 제안하는 새로운 하드웨어구조 및 컨트롤 방법에 대해 언급하였다. 4장에서 기존의 구현 예들과 비교를 통하여 본 논문에서 제안하는 하드웨어 구조의 성능개선 정도를 나타내었으며, 향후 개선방향과 함께 결혼을 맺었다.
Ⅱ. 구현사례
RSA모듈 구현에 대한 기존의 방법들을 살펴보면, 8에서는 모듈로 곱셈을 수행할 때 중간 결과 값 (partial product)에 대한 모듈로 감소 과정에서, 몽고메리 알고리즘이 LSB값에 따라 계수를 더한 것과는 달리, MSB의 값에 따라 계수의 보수를 더하는 방식을 사용하였다. 여기서는 미리 계수의 보수들을 계산해서 레지스터에 저장해 놓고 look-up 하는 단순한 방식을 사용하였는데, 이 때문에 PE (Processing Element)가 아주 간단해져서 빠른클럭 주기를 가능하게 한다. 미리 계산된 계수의 보수들을 저장해 놓기 위한 추가의 레지스터가 들어가지만, 후처리 (post processing)가 필요하지 않기 때문에 적은 양의 계산 시에는 몽고메리 알고리즘보다 유리할 수 있다.
〔9〕에서는 몽고메리 알고리즘을 이용하여 모듈로 곱셈을 2차원 평면상에 시스톨릭 어레이(systolic array)로 구현하였다. k 비트의 입력에 대해 처음으로 출력이 나오기 시작할 때까지 2*+2의 클럭이 소요되지만. 2차원 평면상에 구현된 것이라 그 크기 때문에 실제로 하드웨어로 구현하기는 힘들다.
〔6〕에서는 몽고메리 알고리즘을 이용한 멱승 구조를 하나의 FPGA(Field Programmable Gate Array) 에 들어갈 수 있도록 PE들의한 줄만으로 매핑하여 선형 어레이 구조로 구현하였다. 입력 값 & B, N 에 대한 몽고메리 모듈로 곱셈식 +a, B+qN)/2 의 계산을 매번 반복하기보다는 미리 B+N 값을 계산해 놓고 ai 와 <7, 값에 따라서 0, N, B, B+N 값을 멀티플렉서를 이용하여 선택하는 방식을 취함으로써 덧셈기를 하나로 줄였다. 그러나, 이를 멱승에 적용 시에는 매 곱셈이 끝날 때마다 B+N을 다시 계산해야 한다. 수직 매핑으로 인한 50%의 처리율을 극복하기 위해 제곱과 곱셈의 인자를 인터리빙 하기 때문에 추가의 레지스터와 콘트롤이 복잡해지는 단점도 존재한다. 데이터의 크기 k 비트 입력에 대해서 출력이 나오기까지는 2(/c+2)(Zc+4)의 클럭사이클이 소요된다.
〔10〕에서는 속도를 높이기 위한 다양한 방법으로 CRT(Chinese Remainder Theorem). Carry Completion Adder, Quotient Pipelining을 복합 사용하여 그들이 새로이 제안한 프로그래머블 능동메모리 (PAM: Programmable Active Memory) 구조에 구현하였다. 그러나, RSA 암호화와 복호화시 서로 다른 PAM 디자인을 사용해야하고, 계수가 곱셈기안에 hard-wired되어 있어서 계수가 바뀔 때마다 아키텍쳐를 다시 구성해야 하는 단점을 가지고 있다. Carry Save형태의 Redundant Binary Representation을 사용하였기 때문에 한번의 곱셈이 끝난 후 다음의 곱셈과정으로 이동하기 위해 Non- Redundant 형태로 바꾸어야 하는데, 이 과정에서의 딜레이를 줄이기 위해 Asynchronous Ccarry Completion Detection 회로를 사용하였다.
〔7〕에서는 몽고메리 알고리즘을 적용한 시스톨릭어레이 구조를 수평으로 매핑하고, 전체 멱승 연산을 위해 Binary Method 를 적용하였다. 암호화 시E는 17 비트로 제한하였으며, 복호화 시 CRT를 적용하였다. 곱셈연산 시 클럭수를 줄이기 위해 하이래딕스(high-radix)연산 방식을 적용하였는데, 파이프라이닝을 위한 많은 레지스터를 필요로 하기 때문에 상당한 하드웨어 리소스를 필요로 한다. 또 Binary Method의 적용은 전체 멱승연산에 21ogaE 번의 곱셈이 필요하다는 단점을 가진다.
본 논문에서는 CRT의 적용과 시스톨릭 어레이 구조, 몽고메리 알고리즘 등 위 논문들의 장점을 최대한 활용하는 한편, 반복적 곱셈의 연속인 멱승 연산에서 곱셈의 횟수를 줄기기 위해〔2〕에서 제안한 나눗셈 체인(Division Chain)을 이용하여 보다 빠른 처리속도를 이룰 수 있도록 한다.
Ⅲ. 본론
3.1 RSA 알고리즘과 모듈로 연산
RSA 암호 알고리즘은 1024비트 이상의 크기를 갖는 계수 N 과 평문 메시지 A=ee mod N 인관계를 갖는 두 개의 키 D, E를 가진다. 1024비트크기의 계수 Ne 두 개의 512비트 크기의 소수 p, q의 곱으로 이루어지며 키 E는 0>(N) 이 Euler's totient function 즉, P(lV) = (pT)(gT)일 때 gcd (E, @(N)) = 1 인 관계를 갖는 1<E0>(N) 의 수 중에서 하나를 임의로 선택한다. 키는 ED mod $ (N) = l로 계산되고. E와 N을 공개키로서 공개하며, p, q는 개인키로서 공개되지 않는다. 공개되지 않는 p 와 q 를 계수 N 으로부터 정확히 소인수 분해하기는 1024비트이상의 키 사이즈 때문에 사실상 불가능하며, 이러한 사실이 RSA 알고리즘의 안전성을 보장해 준다. 이 키들을 이용하여 식 (1) 과같이 암호화 C=Ae mod N, 복호화 A = d) mod N를 수행하게 된다. 따라서, RSA 암호시스템은 공개키 EQ 개인키에 대해 모듈로 멱승을 취함으로써 두 과정이 인자만 바뀌고 동일한 연산으로 이루어진다.
#(1)
RSA 연산을 위한 모듈로 멱승 연산의 하드웨어구현 시 고속 처리를 위해 두 가지 면에서 접근이 가능하다. 첫째는 멱승에 필요한 곱셈의 횟수를 줄이는 방법으로, 하드웨어 구현이 용이하면서 하드웨어 리소스를 적게 차지하는 Binary Method를 많이 사용한다. Binary Method는 지수부 E를 E= (ez, -2, —, eo)= S 와 같이 2진 표현에 의해 나타내고 비트열을 왼쪽 또는 오른쪽으로 스캔해나가는 방법에 따라 LR-method와 RL-method 가 있다.'6)LR-method의 경우 스캔한 비트가 1 이면 현재 출력되는 제곱의 결과 값에 4를 곱해주는데, 한번에 한 비트씩 스캔하기 때문에 비트 수 만큼의 제곱과 의 이진 표현에서 1의 개수)만큼의 곱셈이 필요하다. 하지만 여러 비트들을 묶어서 한번에 처리할 경우 추가의 레지스터를 두어 중간에 필요한 값들을 미리 계산해서 저장 하면이 값들을 곱셈연산에 사용할 수 있기 때문에 제곱의 횟수는 동일하더라도 곱셈의 횟수를 줄일 수 있다. 이러한 방법에는 한번에 log2me 비트씩 스캔하는 M-ary Method〔3〕〔5〕가 대표적이다.
본 논문에서 적용한 나눗셈 체인은 지수 E를 임의의 제수(Divisor) dS. 나누고 이때 발생한 몫에 대해 또 다른 d를 적용하여 나눗셈하는 과정을 반복적으로 수행하면 나머지 (Remainder)「의 집합과 그때 사용된 d들의 집합을 얻을 수 있는데 이렇게 얻어진 d와 을 이용해 곱셈의 횟수를 줄일 수 있는 방법이다. 그 내용을 간단히 살펴보면 E는 임의의 제수 d로 나누어 음이 아닌 가장 작은 나머지 r을 남긴다고 할 때 E=dE'+r의 형태로 쓸 수 있다. 이렇게 표현되는,를 계산하기 위해 필요한 최소 곱셈의 횟수를 F(E) 라고 하면 F(E')<F(E)+F{d) + F(r)+1 이 된다. 하지만 d=2' + l이고 r=0, 2?1 + 1,(1)인 경우 위 등식이 성립하지 않는 경우가 존재하는데, 위 조건을 만족할 경우「은 d를 구해 가는 과정에서 얻어 질 수 있으므로 尸(广) 이 제거 될 수 있기 때문이다. 예를 들어 A349 를 d=17 로 나누면 (4”) 가 되고, £7을 순서로 계산한다면 矽는 따로 계산할 필요가 없다. 때문에 Binary Method를 적용시키면 F(E) = 13 이지만 위와 같이 변형하여 사용할 경우 11번의 곱셈으로 A349 를 계산할 수 있다.
위의 조건을 만족하는 제수 d와 나머지 들의 쌍을 선정하고 이를 반복적으로 수행하면 do, <d2. ... dn-i. d, 의 제수들의 집합을 얻을 수가 있고, 이에 따라 나눗셈에 대한 나머지 ro, n, r2.......fn-i, rn 의 집합을 얻을 수 있다. 따라서, A에 대한 E 는
#
가 되고, 다시 (d, r)의 형태로 표현하면
#(2)
와 같이 쓸 수 있다. 식 2와 같이 멱승 연산에 직접적으로 사용될 수 있는 (d, r)의 시퀀스(Sequence) 를 나눗셈 체인(Division Chain)이라고 하며, E 값으로부터 나눗셈 체인을 만들어 내는 예를 식 3에 보인다. (2)
#(3)
식 (3)에 임의의 E=875를 적용하면, E=2+9(l+3 (0+2(0+2(0+29+2(0+2))))))와 같이 표현되고 또 식 (2)를 이용하면 (9, 2)(3, 1)(2, 0)(2, 0)(2, 0) (2, 0)(2, 0) 와 같이 고쳐 쓸 수 있다. 전체 연산은 (d, r)이 (9, 2)인 왼쪽에서 오른쪽으로 이루어진다 Addition Chaine 지수 E를 표현하는 가장 효과적인 방법으로 알려져 있는데, 임의의 시퀀스
#(4)
를 가정하고, 임의의 j 에 대해
#
가 항상 성립할 때 식 4를 E 에 대한 Addition Chain이라고 한다.
위의 예를 각각 Addition Chain으로 표현하면 (1, 2, 4, 8, 9)(1, 2, 3)(L2)(L2)(L2)(1, 2)(1, 2) 가 되고, 전체 연산은(124, 8911, 18, 27, 54, 108, 216, 432, 864, 875)가 된다. 계산이 일어나는 순서는 먼저 (9, 2)에서 를 구해야 하는데, LR-method를 적용하여 42->, 44->48->49의 순서로 계산한다. a9 을 구하기 위해 As 과 곱하는 4는 임의의 레지스터에 저장되어 있어야 하고, 나머지 값인 厶2는 또 다른 레지스터에 저장한다. 다음으로 (3.1)의 계산은 B=A9 이 되어 B2->33의 순서로 계산된다. 이때 나머지 값이 존재하므로 3를 이전에 나머지로 저장하고 있던 4와 곱해 을 나머지 값으로써 다시 저장한다. D=A54, E=^108, F=A216, G=A432, //=64가 되며 최종적으로 나머지 값으로 저장되어 있던 과 H를 곱하면 원하는 값을 얻을 수 있다. 즉 Binary Method를 적용하면 E= 1101101011이 되어 16번의 곱셈이 필요하지만 나눗셈 체인을 적용할 경우 (9.2)의 계산에 나머지 처리를 포함하여 5번, A2x5 계산에 1번, (3, 1)에 2번, (2, 0)에 각 한번씩 5번의 곱셈이 필요하다. 최종적으로 나머지 값과 H를 곱하는데 1번의 곱셈이 필요하므로 전부 14번의 곱셈이 필요하게된다. RSA와 같이 1024비트 이상의 E를 사용할 경우 곱셈의 횟수는 현격히 줄어들어 식 (3)과 같이 d=2, 3, 9를 사용하였을 경우 평균 약 1.40641 번의 곱셈으로 멱승 연산이 가능하다.(2)
성능개선을 위한 두 번째 접근방법은 멱승 연산 시 무수히 많이 발생하는 곱셈을 효율적으로 처리하는 것이다. 모듈로 곱셈은 연속된 덧셈 연산으로 수행될 수 있으며 곱셈 연산 시 곱셈을 먼저 한 후 모듈로 연산을 하는 곱셈 후 모듈로 감소(modulo reduction after multiplication) 방식과 곱셈 중에 모듈로 연산을 반복흐]는 곱셈 중 모듈로 감소(modulo reduction during multiplication)방식이 있다. 모듈로 곱셈기의 하드웨어 구현 시 전자의 경우 입력 값의 비트 수를 k 비트라 할 때, g 비트의 곱셈기와 2k 비트의 레지스터 그리고 2Ac 비트의 나눗셈기 등 리소스를 많이 차지한다. 때문에 주로 후자의 방법을 사용하며 이 방법은 연속적인 덧셈에 의해서 만들어지는 중간 값(Partial Product)을 어떻게 처리하느냐에 따라 두 가지 방법으로 나뉘어 진다. 첫째로 MSB방향으로 커지는 비트를 보고 적당한 계수의 배수를 뺌으로써 새로 늘어난 비트를 제거하는 방법으로 전체적인 비트수를 감소, 유지시키는 MSB우선 방식⑻과 둘째로 LSB부분을 '0'으로 만드는 적당한 계수의 배수를 더한 다음 오른쪽으로 쉬프트 하는 방법으로 LSB부분을 제거함으로써 전체적인 비트 수를 감소, 유지시키는 LSB우선 방식'⑸이 있다. 이 중에 몽고메리 알고리즘은 LSB 우선방식의 대표적인 예로써 계수의 덧셈에 대한 선택이 하위 비트에서 이루어지기 때문에 파이프라인 구현 시 캐리의 지연을 고려치 않아도 되는 장점이 있어 고속 연산을 위해 주로 사용된다. 본 논문에서도 나눗셈 체인을 적용하기 위해 몽고메리 알고리즘을 적용하여 모듈로 곱셈기 를 설계하였다.
3.2 CRT(Chinese Remainder Theorem)
전자 서명의 생성과정이기도 한 RSA를 이용한 데이터 복호화 과정은
#
로 표현된다. 이때 키의 생성자인 수신자가 계수 N의 인자 (p, q) 를 알고 있으므로 CRT를 이용하여 보다 빠르게 수행할 수 있는데, 이 방법은 Quisquater 와 Couvreur에 의해 제안되었다.'⑹
서로 다른 pi에 대해 i=l, 2.......k이고, 고가 각각 서로 소인 관계를 갖는 정수라고 할 때. 즉,
#
일 때 uG〔0, pT〕가 주어지면, P=pi, p2, ...pk 인 [0.P-1] 범위 내에 u=M(mod)인 유일한 u가 존재한다. 또한,
#(5)
와 같이 구할 수 있다. 여기서, Pi =PlP2...Pi-lPi...Pk =P/p, 이고, G는 계수 Pi에 대한 R의 곱셈에 대한 역원 즉, c, F, = 7(mod Pi) 이다. 위의 내용을 통해
#
와 같으며 p, q를 이용해 다음과 같이 나누어 계산할 수 있다.
#
계수 N을 구성하는 p, q는 각각 k/2 비트이며, 여기에 다시 Fermat's theorem을 적용하여, DP=D (mod(p-l))t Pg=P(mod((7-l)) 이라 놓으면
#
가 되어 개인키로 사용되는 D는 p와 q에 대해 각각 k/2 비트로 만들 수 있다. 또한 G=C(mod p), Q = C(mod g)로 치환하면 모든 인자를 k/2 비트로 줄일 수 있다.
#(6)
식 ⑸에 k/2 비트 &와 대입하여
#
와 같이 k 비트을 구할 수 있다. 여기서, (mod p), C%=p니 (mod q) 이며
#
와 같이 간단히 증명된다.
본 논문에서는 k 비트 암호문 Q 과 C2에 CRT 를 적용하여 k/2 비트 Cpl, Cp2, Cql, Cq2으로 나누고, 두 개의 k/2 비트 곱셈기 모듈을 통해 동시에 처리되도록 하기 위해 지수부로 사용되는 p에 대한 Cpi. Cp2 을 먼저 처리하고 q에 대한 Cqi를 인터리빙 하는 방법을 이용하였다. 이로써 곱셈 시 클럭수를 절반으로 줄이고, 멱승 시 클럭수를 절반으로 줄일 수 있으며, 전체 처리율은 100%가 되고 클럭수가 1/4로 줄어들어 4배 향상된 속도를 얻을 수 있도록 하였다.
3.3 파이프라인드(Pipelined) 몽고메리 곱셈기
나눗셈 체인을 이용한 멱승 연산을 위해서는 식 (2) 에 나타나는 각각의 (d, r)을 위한 곱셈기를 우선적으로 설계하여야 한다.[그림 1]은 몽고메리 알고리즘을 이용한 모듈로 멱승 처리기의 내부 계산 구조를 보이기 위해 그림 2의 PE를 이용하여 4비트의 키 사이즈에 대한 데이터의 종속 그래프(DG : Dependence Graph)를 나타낸 것이다. 이를 어떤 방향으로 매핑하고, 어떻게 스케쥴링 하느냐에 따라 다양한 곱셈기 모듈이 구현 될 수 있는데, 본 논문에서는 데이터 이동방향을 고려하여 처리율 100%의 파이프라인 동작이 가능하도록 하기 위해 DG를 수평으로 매핑하는 방법을 택하였다.
(그림 1) 몽고메리 곱셈기의 DG(k=4)
(그림 2) 몽고메리 곱셈기의 노드함수와 PE
식 (2)의 0, "는 LR-method를 이용하기 때문에 이전 결과 값을 받아서 계산해야 되는데[그림 2〕 를 수평매핑 한다고 할 때 한번의 곱셈연산이 끝나고 14 클럭 후 최초의 출력이 나오기까지 다음 입력을 위해 기다리게 되면 50%의 처리율 밖에 이룰 수 없다. 그 이유는 첫 번재 PE는 8클럭 후에 입력이 없으면 아무런 연산을 수행하지 않기 때문이다. 이는 8클럭 후에 sum_out 값을 받아서 연산을 시작해야 하는 5번째 PE를 첫 번째 PE가 대신할 수 있도록 하면 100%처리율을 이룰 수 있다.[그림 3J 에 그 신호의 흐름을 나타내었다. 이로써 4개의 PE 로 전체 연산이 가능하기 때문에 필요한 PE의 개수를 반으로 줄일 수 있으며 k 비트 연산에 대해 절반의 하드웨어 리소스로 연산이 가능하게된다. 요구되는 clock cyclee 최초의 출력 값이 나올 때까지 기다렸다가 다음 출력으로 사용해야 되기 때문에 한 번의 곱셈에 2(k+4)이 필요하고 전체 멱승에는 평균 1.4064(4))클럭이 필요하다.(2) 이는 k/2 개의 PE를 사용하였을 경우이며 k 비트 키 사이즈에 대해 두 개의 연속하는 2k 비트의 평문을 입력으로 받아 두 개의 서로 다른 A비트 평문이 병렬로 동시에 처리되도록 하면 처리율 100%를 이룰 수 있을 뿐 아니라 성능은 두 배가된다.
[그림 2〕의 (a)의 그래프를 선형 어레이 곱셈 기로 구현하기 위해 수평으로 매핑한 후 각 PE 간의 신호의 흐름을 나타내는 SFG(Signal Flow Chart)를 [그림 3〕의 (a)에 나타내었으며, [그림 3〕의 (b) 는복호화 시의 SFG를 나타낸 것이다.[그림 3〕의 (a) 에서, 제일 상단에 위치한 멀티플렉서는 PE를 재사용하기 위해 추가한 것으로, 8 클럭까지 "aoaiazasOOOO”, “nomamOOOO”와 PE 내부 멀티플렉서를 컨트롤하기 위한 "10000000”의 q_con이 입력되고, 9번째 클럭에서 피드백 되는 값들을 받기 위해 추가한 멀티플렉서인 get_feed를 통해 PE4로부터 출력되는 sum 과 n, a, q_con을 입력으로 받을 수 있다. 복호화 과정에서 CRT의 적용 시 암호문 G는 식(6)에 의해 각 k/2 비트인 %, t淑가 되고[그림 3〕의 (b) 와 같이 k+3개의 PE를 가지는 동일한 두 개의 곱셈기 모듈의 처음 입력으로 동시에 들어가고, 6 클럭 후에 C以과 C砂에 해당되는 암호문이 입력으로 들어가 P에 대한 암호문과는 독립적으로 처리되도록 한다. 즉, 첫 번째 PE는 6 클럭 동안 G의 암호 문이 입력되고, 7번째 클럭 부터 12번째 클럭 까지 Q의 암호문이 입력된다. 今에 대한 결과 값이 10 클럭후에 출력되지만 첫 번째 PE가 Q를 입력으로 받고있는 상태이므로, 다음 곱셈을 위한 입력으로 사용하기 위해서는 두 클럭을 쉬어야 한다. 12 클럭 후의 최초 출력 값은 다음 곱셈을 위해 사용한다든지 레지스터에 저장될 입력 값으로 사용할 수 있다. 전체 연산에 필요한 레지스터는 각 키 값들을 저장하기 위한 레지스터와 중간결과 값들을 저장하기 위한 레지스터가 필요하다. 을 저장하기 위한 레지스터를 M 레지스터 (m_reg)라 하고, Ar 즉, 나머지 값을 저장하기 위한 레지스터를 P 레지스터 (p_reg) 라 한다. 몽고메리 알고리즘을 모듈로 멱승에 적용하기 위해서는 각 곱셈의 정확한 값을 구하는데 필요한 후처리 과정을 없애기 위해 전처리 과정에서 允 에 mont_val = 22</t+3)mod N 값을 곱해 주어야 하는데, ⑺ 최초 계산이 일어나기 전 M 레지스터에는 4를 저장하고 P 레지스터에는 mont_val을 저장한다. 두 개의 레지스터 P와 Me 복호화 시 CRT를 적용하기 위해 각각 두 부분으로 나뉘어 진다. p_regl, P_reg2는 복호화 과정에서 멱승의 유효한 입력 값의 크기를 맞추기 위해 추가한 4비트와 함께 각각 독립적인 k+4비트 쉬프트 레지스터를 구성한다. en 이 0인 상태에서 복호화가 이루어지고, 1이면 암호화가 이루어지는데, 암호화 시 p_reg2의 결과 값이 p_regl 의 입력으로 사용되어[그림 4〕의 p_regl와 쌍을 이루어 하나의 k+4비트 쉬프트 레지스터를 구성한다.
(그림 3) 몽고메리 곱셈기의 SFG
(그림 4) P 레지스터
m_reg는 p_reg와 동일한 구조를 가지며, n_reg는 n_reg2에서 곱셈기 블록으로부터의 입력이 없다는 것을 제외하면 p_reg와 동일한 구조를 가진다.
3.4 나눗셈 체인(Division Chain)을 이용한 모듈로 멱승
컨트롤 방법이 간단한 Binary Method의 경우 지수 E는 1 또는 0으로 표현되기 때문에 한 비트씩 이동하면서 항상 제곱을 수행하고, 해당되는 비트가 1이면 곱셈을 수행한다.
여기서 (dM0)(d5)(d:”2)...(d"n) 으로 표현되는 나눗셈 체인을 직접적으로 멱승연산에 이용할 경우 각각의 (d, r)로부터 위와 같은 규칙성을 찾기가 힘들다. 또 d=2, 3, 9의 경우보다 더 많은 d를 사용하는 경우(2) 어떤 d들을 사용하느냐에 따라 컨트롤 또한 틀려지기 때문에 하드웨어 구현에 많은 어려움이 따른다. 예를 들어 식 (3)에서 생성된 나눗셈 체인에서 일어날 수 있는 모든 경우에 대해 디코딩해서 컨트롤 시그널을 생성한다고 가정할 때 경우의 수는 7이 된다. 각각의 경우를 할당하기 위해 3비트면 충분하므로 비교적 간단한 하드웨어 구조를 가진다. 하지만 4=2, 3, 5, 9, 17, 33을 이용한다고 할 때 생성될 수 있는 (d, r)의 경우의 수는 24가 된다.(2) 각각을 할당하기 위해 5비트가 필요하고 이 5비트로부터 컨트롤 시그널 생성을 위해 디코딩한다고 할 때 d=2, 3, 9의 경우와 다른 하드웨어를 다시 만들어야 하는 문제점이 발생한다.
또 성능향상을 위해 사용되는 d를 더 많이 사용한다고 할 때 항상 하드웨어를 바꾸어주어야 할 뿐만 아니라 서로 다른 경우를 정의하기 위해 필요한 비트 수는 계속 늘어난다.
이러한 문제점을 해결하기 위해 본 논문에서는 d=2'+l인 모든 경우에 적용가능 하도록[그림 5〕 와같이 소프트웨어를 이용해 나눗셈 체인을 한번의 곱셈에 두 비트만을 할당하는 새로운 코딩방법을 제안한다. 예를 들어 E=875일 때 d=2, 3, 9를 적용하면 ((93, , 21) )(2, 0)(2, 0)(2, 0)(2, 0)(2, 0) 과 같은 나눗셈 체인을 가진다는 것을 앞서 언급하였는데, 이 경우 새롭게 코딩된 비트열은[그림 5〕의 (a)에 따라 01100000111000111111111111과 같은 비트열을 가지게 된다. 새롭게 변형된 나눗셈 체인의 비트 열을 Div_code라 부르기로 한다. Div_code는 곱셈이 한번 일어날 때마다 좌측으로 두 비트씩 스캔하고 이 두 비트가 FSM(Finite State Machine) 의 상태를 변화시키는 입력으로 사용되도록 하였다. 이에 따른 상태천이에 관한 내용은[그림 6〕의 FSM 과 함께 언급하였다.
[그림 5〕나눗셈 체인의 encoding table
(그림 6) 컨트롤 블록의 FSM
변형된 비트열의 저장은 k 비트 레지스터 (encoded. dc_reg)에 최초로 키 값들의 저장과 함께 k 비트를 저장하고 k/2번의 곱셈이 끝난 후 새롭게 코딩된 비트열의 연속하는 k 비트를 encoded_dc_reg 레지스터에 다시 저장하는 방법을 이용한다. 곱셈이 최대 21og2£ 번 필요하다고 할 때 필요한 레지스터는 4k 비트이고 이를 전부 저장하는 것은 하드웨어 리소스를 효율적으로 이용하지 못하는 결과를 초래하기 때문에 추가적으로 3번만 데이터 교환이 이루어지도록 구현하여 하드웨어리소스를 낭비하지 않도록 하였다. 추가적인 데이터 교환은 1024비트 연산을 수행하는데 수 ms가 소요됨을 감안하면 전체적인 성능에 큰 영향을 미치지 않는다.
[그림 5〕의 (a)는 divisor 2, 3, 9를 사용하였을 때 발생할 수 있는 모든 경우를 나타낸 것이며 각각의 div_code 생성은 다음과 같다. (d, r) = (2, 0) 즉, 2 로 나누어 0을 남기는 경우는 현재 출력되는 이전의결과 값으로 제곱하는 경우이며 이때의 결과 값은 레지스터에 저장하지 않아도 되고 div_code = ll이 된다. 새로운 (d, r)이 시작될 때 이전의 결과값을받아 제곱이 실행될 경우 즉 (d/)u{(3.0), (3.2), (9, 0). , ((99, 2, 5) ), (9, 8)}인 경우 최초의 div_code는 01 이 된다. 이때 제곱에 사용된 A 는 /『을 구하는데 사용되므로 M 레지스터에 저장 되어야한다. 새로운 。/)이 시작되는 부분이지만 1을 나머지로 남기는 경우 즉 (d, r)w{(2, 1), (3, 1), (9, 1)}의 경우 이전 곱셈의 결과 값과 P 레지스터의 값을 곱해서 다시 P 레지스터로 저장해 주어야 한다. 이때 div_code = 01 과 마찬가지로 현재 출력되는 결과 값은 M 레지스터에 저장되어야 하며 이때는 div_code = 10이 되도록 한다. 4』을 구해 가는 과정에서 단순히 이전의 결과 값을 이용하여 제곱이 일어나는 경우는 div_code=00이 되도록 한다. A9 또는 泌은 현재 곱셈의 결과로 얻어진 값인 A8 또는 泌과 M 레지스터에 저장되어 있는 의 곱으로 얻어지는데 이런 경우div_code=ll 이 된다. (2, 0)의 경우 div_code = ll이기 때문에 이 경우와 div_code는 동일하지만 상태천이의 시점이 틀리기 때문에 충돌은 일어나지 않는다. 특히 div_code = 10은 나머지를 위한 계산이 이루어지는 과정이므로 div_code = 10 다음의 곱셈을 수행할 때 P레지스터에는div_code = 10일 때의 결과 값을 저장할 수 있도록 해야 한다. 이상과 같은 방법을 (9, 5)의 경우에 적용시킬 경우. 四4 과 m 레지스터의 값인 厶와 곱셈이 일어날 때 위 설명대로 코딩한다면 div_code = 01 00 11--- 이 되기 때문에 ((3, 1), (9.1), (9, 2)}와 같이 마지막 네 비트가 00 11 인 경우와 구별이 되지 않는다. 따라서 div_ code = 00 다음에는 div_code = 01의 계산이 필요한 경우가 존재하지 않으므로 div_code = 01 로 만들고 이를 (9, 5) 즉 r=2H + l 경우에서 사용한다. 이때 泌를 계산한 후 더 이상 4를 저장하고 있어야 할의 계산에 사용한 a4필요가 없기 때문에를 M 레지스터에 저장하고 A, 의 계산에 사용한다. 나머지 계산을 위해 厶5의 결과를 p 레지스터의 값과 곱함과 동시에 P 레지스터에 저장해 두었다가, M 레지스터에 저장되어 있는 厶4와 곱하여 厶9을 계산하는데 사용할 수 있도록 하며div_code = ll이 된다. [그림 5〕의 (b)는 각각의 곱셈에 따른 두 개의 대상(operand)과 그때 사용되는 상태천이를 위한 입력 값을 함께 나타낸 것인더L 예를 들어 (dn, rn) = (9, 2)의 경우 泌-泞應七密七密七泌의 순서로 곱셈을 한다.[그림 5〕의 (a)에 따라 최초의 div_code = 01이며, n=0 라면 M 레지스터에 저장되어 있는 값을 제곱하고 이면 현재 출력되는 값을 제곱한다. 다음으로 div_code = 10 이며 疽은 나머지 값으로 다시 사용되어야 하기 때문에 나머지 값을 저장하고 있는 P 레지스터의 값과 곱해주어야 한다. 이전에 저장되어 있던 나머지 값이 존재하지 않는다면 P 레지스터는 ?矽이 되고, 이전에 값을 가지고 있다면 그 값과 /非의 값을 곱한 결과를 P 레지스터에 저장한다.는 A2의 제곱으로 얻어지는데 A2 은 div_code = 01의 계산이 끝나고 출력되는 값이며 div_code = 10으로 천이 하면서 P 레지스터에 일시적으로 저장한다. 이는 div_code = 10에서 P 레지스터의 값은 현재 연산을 위해 곱셈기로 입력되고 있는 상태이므로 일시적으로 비어 있는 상태이므로 가능하다. div_code=00에서 현재 출력되는 결과값에 대한 제곱이 두 번 일어나고 div_code = ll에서 A4xA4 결과 값으로 출력되는 K5과 M 레지스터에 저장되어 있는 4와 곱하는데, 그 결과, 疽 이 출력되고 다음 (d, r)을 위해, 疽은 m 레지스터에 저장된다.
이상과 같은 코딩방법을 적용하면 d=2'+l인 모든 경우에 적용가능하며, 앞서 언급한 것처럼 서로 다른 (d, r)을 디코딩 해서 컨트롤 시그널을 생성한다고 할 때 하드웨어를 다시 구성해야 하는 문제점을 해결할 수 있다.
전체 연산에서 두 비트 div_code가 입력됨에 따라 한번의 곱셈이 일어나게 되는데, 그 때 곱셈의 대상이 달라지고 레지스터의 입력 값이 달라진다. 곱셈이 일어나는 경우에 대해 하나의 상태로 정의하고, 상태천이에 따른 state diagram을[그림 6] 에 나타내었다. 상태는 13개가 필요하고 각각의 상태에 대해 간단히 언급하면, 각각의 상태에 R*R 이 붙는 경우 즉 Even R*R, Normal R*R. Init R*R 은 이전 상태의 결과 값을 제곱하는 경우이다. Special M*R, Last "日은 이전 상태의 결과 값과 M 레지스터에 저장되어 있는 값을, 그리고 Inner P*R 은 이전상태의 결과 값에 P 레지스터의 값을 곱하는 경우이다. Last P*M 은 P 레지스터의 값과 M 레지스터의 값을 곱하며 P*P 는 P 레지스터의 값을 제곱하는 경우이다. Initl과 Init2는 각각 1 과 평문 M 을 mont_val 와 곱한다.[그림 6〕에서 Start 시그널이 입력되면 Initl과 Init2를 통해 몽고메리 모듈러 곱셈을 위한 전처리 과정을 수행하고, [그림 6〕과 함께 제시한 예에서 addition chain이 (1, 248, 9)인 (次广) = (9, 2)에서 div_code = 01 가된다. 때문에 Init2에서 Init R*R 상태로 천이 하게 된다. 이때는 Init2에서 곱셈기의 출력 값인 A = Mx22<W3)mod N을 이용하여 제곱을 수행한다. 마지막의 1001은 현재 출력되는 최종 값과 P 레지스터의 값을 곱하기 위해 Init P*R 또는 InnerP*R 로 천이하고, 최종적으로 Post 상태로 천이 하여 1을 곱하여 원하는 결과 값을 얻을 수 있도록 하기 위해 추가한 것이다.
[그림 7〕은[그림 6〕에서 출력되는 컨트롤 시그널이 곱셈기와 P 레지스터, 그리고 M 레지스터를 어떻게 컨트롤하는지를 나타내기 위해 E=875일 때의 예와 함께 나타내었으며, 〔표 1〕에 상태 테이블을 나타내었다.
(그림 7) div c* ode 이용한 전체 멱승
〔표 1] 상태 테이블(State Table)
앞에서 설명한 멱승기의 하드웨어 구조를[그림 8] 에 나타내었다. 모듈러 곱셈기 블록인 MM 1 블럭과 MM 2 블록은 동일한 구조를 가지며, k 비트의 모듈로 멱승기를 구현할 때 각각 k/2 + 3개의 PE로 구성된다. 멀티플렉서 콘트롤 시그널 de_part_sel 은 복호화 시에 免와 Q에 대한 연산이 교대로 이루어지므로 각각의 레지스터 쉬프트 이네이블 시그널과 동일한 시그널을 이용하여 현재 쉬프트 하고 있는 레지스터 값이 출력이 되도록 한다.
[그림 8) RSA 멱승 처리기의 전체 구조
Ⅳ. 결론
본 논문에서는 RSA알고리즘의 하드웨어 구현에 있어서 보다 빠른 성능을 이루기 위해 나눗셈 체인 E고메리 알고리즘, 복호화 시에 CRT방법을 적용하여 구현하였다. 나눗셈 체인을 이용한 멱 승방 법은 알고리즘 자체로는 상당한 성능개선을 보이지만 하드웨어로 구현할 때 데이터 패스(data path) 의규칙성을 찾기가 힘들어 컨트롤이 복잡해질 뿐만 아니라 더 많은 경우의 d를 사용할 경우 각각에 대해 하드웨어를 다시 구성해야 하는 단점을 가진다. 따라서 본 논문에서는 나눗셈 체인을 그대로 사용하지 않고 새롭게 코딩하는 방법을 제안하여 위의 문제점을 해결하고자 하였다. 또 몽고메리 알고리즘의 DG 를 수평으로 매핑하여 PE를 재사용할 수 있도록 하였기 때문에 /c+6개의 PE로 100%의 처리율을 가질 수 있도록 하였다.
복호화의 경우에는 사용자가 합성수 N의 인수를 알고 있기 때문에 CRT의 적용이 가능하다. 따라서두 개의 독립된 곱셈기 모듈이 인터리빙을 이용해 4 개의 Zc/2 비트 암호문을 교대로 처리 할 수 있도록 하였다. 이렇게 함으로써 CRT를 사용하지 않을 경우 보다 4배 정도의 속도 향상을 이루었다. CRT 의사용이 불가능해 복호화에 비해 상대적으로 속도가 느린 암호화과정에 대해서는 공개키 E 값을 17비트이하로 제한하여 사용함으로써 전체적으로 빠른 속도를 유지하였다.
그 결과를 다른 RSA의 하드웨어 구현 논문들 중성 능이 뛰어나다고 판단되는 논문'6W들과 비교하여 〔표 2〕와〔표 3〕에 나타내었다.〔7〕에서는 곱셈 연산에 하이래딕스 연산방식을 적용하여 래딕스의 크기에 따라 하나의 PE 내에 log2mpxlog22Zlp 비트의 곱셈기와 파이프라이닝을 위한 많은 레지스터를 필요로 하기 때문에 상당한 하드웨어 리소스를 요구하게 된다. 반면 본 논문에서 제안하는 하드웨어의 구조는 洱>=2를 사용하였기 때문에 상대적으로 적은 하드웨어 리소스로 구현이 가능하다.〔6〕에서는 FPGA 에 구현하였는데 사용되는 CLB(Configurable Logic Block) 의 숫자를 줄이기 위해 u개의 PE를 하나의 CLB에 구현하는 방법을 사용하였다. 전체구조는 모듈로 곱셈기의 시스톨릭 어레이를 수직으로 매핑하였고 직렬로 입력되는 한 비트에 대해 u개의 비트가 처리되도록 하였기 때문에 하드웨어 리소스는 mp=2 와 비슷하다.〔표 2〕를 통해 삼성 0.5如 CMOS 스탠다드 셀 라이브러리를 근거로 이를 예측하고 비교하여 나타내었다.
(표 2) 게이트 카운트(gate count) 비교
(표 3) 성능 비교
본 논문의 설계 방법론에 따라 곱셈연산에 mP=16 의 하이래딕스 연산 수행을 가정하면 임의의 E를 사용한 암호화의 경우 445Kbps의 속도로 처리가 가능하며, CRT를 적용한 복호화는 1.8Mbps의 속도로 처리할 수 있다. 따라서, 본 논문이 하드웨어 구현에 따른 알고리즘의 효율적인 적용에 관심의 초점을 두고 이진 연산방식을 적용한 것을 고려하면 본 논문의 성능개선은 다른 방법들보다 방법론적인 측면에서 상당히 우수하다고 할 수 있다. 이를 성능 면에서 비교하여〔표 3〕에 나타내었다.
ASIC으로 구현을 위해 삼성 0.5um CMOS 스텐다드 셀 라이브러리'⑺을 이용하여 합성한 결과 최장 지연패스는 덧셈기(full adder) 2개의 덧셈결과값이 나오기까지의 지연 시간과 두 개의 논리합, 그리고 두 개의 2:1 멀티플렉서를 거치는 지연 시간을 더한 값이 되어 4.24ns를 얻을 수 있다. 전체 게이트 카운트는 2입력 NAND 게이트를 기본단위로 하여 약 14만 게이트를 차지한다.〔표 3〕에 보이듯이 클럭 주파수 200MHz에서 암호화 시 140Kbps, 복호화시 CRT의 사용으로 560Kbps의 성능을 갖게 된다.
* 본 논문은 2001년 광운대학교 교내 학술 연구 지원과 광운대학교 반도체설계교욱센터(IDEC) 의 설계 툴 지원에 의해 연구되었습니다.
참고문헌
- Communications of the Association for Computing Machinery v.21 no.2 A method for obtaining digital signatures and public-key cryptosystems R.l. Rivest;A. Shamir;L. Adlemn https://doi.org/10.1145/359340.359342
- IEEE Trans. On Computers v.47 no.7 Exponentition Using Division Chains Colin Walter
- RSA laboratories Technical Reprot High-Speed RSA Implementation Cetin Kaya Koc
- RSA Laboratories Technical Report RSA Hardware Implementation Cetin Kaya Koc
- Seminumerical Algorithms, (Second ed.) v.2 The Art of Computer Programming D.E Knuth
- IEEE Symposium on Computer Arithmetic Montgomery Modular Exponentiation on Reconfigurable Hardware Thomas Blum;Christof Paar
- Journal of The Korean Institute of Information Security and Cryptology v.10 no.4 Implementation of High-radix Exponentiator for RSA using CRT S.Lee;S.Kim;Y.Jeong
- IEEE Tran. on VLSI Systems v.5 VLSI array algorithms and architectures for RSA modular multiplication Y.Jeong;W.Burleson https://doi.org/10.1109/92.585224
- IEEE Trans. On Computers v.42 Systolic modular multiplication Colin Walter
- Proceedings of 11th IEEE Symposium on Computer Arithmetic Fast implementations of RSA cryptography M. Shand;J. Vuillemin
- Computers and Mathematics with Applications Analysis of Sliding Window Techniques for Exponentiation Cetin Kaya Koc
- CRYPTO 89 addition Chain Heuristics Jurjen N. Bos;Matthijs J. Coster
- Theoretical Computer Science v.129 no.2 Exponentiation using Canonical Recoding Omer Egecioglu;Cetin K. Koc https://doi.org/10.1016/0304-3975(94)90037-X
- Q.J. Mech. Appl. Math v.4 no.2 A signed binary multiplication technique A. D. Booth https://doi.org/10.1093/qjmam/4.2.236
- Mathmatics of computation v.44 Modular multiplication without trial division P. Montgomery https://doi.org/10.2307/2007970
- IEE Electronics Letters v.18 Fast Decipherment Algorithm for RSA Public-key Cryptosystem J. Quisquater;C. Couvreur https://doi.org/10.1049/el:19820617
- ASIC STD85/STDM85 0.5um High Density CMOS Standard Cell Ligrary Samsung Electronics