'공개키기반구조'에 해당되는 글 5건

  1. 2008.01.02 인증서와 전자서명
  2. 2007.12.21 ASN.1과 인코딩 방법
  3. 2007.12.20 공개키알고리즘 Part.1
  4. 2007.12.20 대칭키알고리즘 Part.1
  5. 2007.07.02 해쉬알고리즘 Part.1

이 글을 읽는 분들 중에는 아직 주민자치센터(동사무소)에 인감증명서를 등록하여 사용해 본 경험이 없는 분들도 많으실 것으로 생각됩니다. 일반적으로 인감증명서는 본인이 직접하여야 하는 법률행위를 다른 사람에게 대리로 하게 할 때, 본인의 행위임을 증명하기 위해 사용합니다. 말이 어렵나요? 가령 관공서나 은행같은 곳에 업무차 본인이 직접 방문한다면 주민등록증만으로 모든 일을 해결할 수 있습니다. 하지만 바쁘거나 여타 부득이한 사정으로 인해 다른 사람을 시켜야 할 수도 있지 않습니까? 이런 경우에 일을 시킨 그 '다른 사람'을 법에서는 대리인이라고 합니다. 관공서나 은행에서는 대리인 방문시, 대리인이 변호사나 법무사 또는 법정대리인이 아니라면 예외없이 인감증명서를 요구할 것입니다. 주민등록증만 가지고 가봐야 아무리 사정을 설명한다고 해도 다시 발길을 되돌릴 수밖에 없을 것입니다.

인감증명서와 관련된 각종 용어설명

인영(印影) : 도장이 찍힌 모습
인감(印鑑) : 관공서에 미리 신고해 둔 인영
인감증명 : 도장의 인영이 신고된 인감과 동일하다는 것을 관공서의 장이 증명하는 일
인감증명서 : 인감증명법에 따라 발급되어 인감을 증명하는 문서

인감증명이란 설명을 왜 했느냐 하면, 지금부터 살펴 볼 전자서명과 인증서라는 개념이 바로 이 인영(印影)과 인감증명서에서 왔기 때문입니다. 과거와 같이 오프라인 밖에 존재하지 않았던 시절에는 본인이 직접 대면할 경우 주민등록증으로, 대리인을 시킬 경우에는 인감증명서로 충분히 본인확인이 가능했지만, 온라인의 범위가 점점 확대되고 과거 오프라인으로 처리했던 각종 일들이 온라인으로 처리가 가능해지면서 온라인에서 사용할 수 있는 주민등록증 또는 인감증명서와 같은 개념을 필요로 했던 것입니다. 온라인으로 주민등록증 또는 인감증명서를 보낼 수도 없거니와 스캔해서 보낸다고 하더라도 사본이니 효력도 없는 일 아니겠습니까?

인터넷뱅킹으로 로그인을 할 때 전자서명을 제출하게 되는데(보통 은행에서 "공인인증서 제출"과 같은 말을 사용하는데 이는 정확한 표현이 아닙니다. 일반인들이 전자서명이라는 단어에 익숙하지 않은 때에 생성된 단어가 굳어진 것이라고 할 수 있습니다.), 일반적으로 은행을 방문하면 주민등록증을 제출하는 것으로 본인확인을 하므로 인터넷뱅킹에서 인증서는 어찌보면 온라인에서 사용할 수 있는 주민등록증과 유사하게 생각될 수도 있겠습니다. 하지만 온라인 특성이 사람간의 직접 대면에 의한 본인확인이 아니라 위에서 설명한 바와 같이 비대면이라는 특수성에 기인한 "대리"라는 성격과 아래의 그림과 같은 외견 등으로 오히려 인감증명서와 더 유사하다는 것을 알 수 있습니다.

인감증명서
인감증명서 인증서
인감증명 인증서발급
인감도장 개인키
인감 공개키
인영 전자서명

온라인 상의 인감증명서가 인증서라고 하였는데 공개키, 개인키가 갑자기 나와서 어리둥절 하실지도 모르겠습니다. 인증서에 필요한 가장 기반이 되는 기술이 바로 공개키 알고리즘입니다. (공개키 알고리즘에 대한 자세한 설명은 공개키알고리즘 Part.1을 참고하세요.) 인감도장을 안전하게 관리하시는 것과 마찬가지로 개인키도 역시 안전하게 보관하셔야 합니다. 개인키를 안전하게 보관하는 방법은 물리적인 매체를 이용하는 방법(보안토큰)과 개인키를 패스워드로 암호화하여 보관하는 방법(주로 "인증서암호" 라고 합니다)이 있습니다. 현시점에서는 개인키를 패스워드로 암호화하는 방법을 많이 사용하고 있습니다만, 향후에는 보다 안전한 물리적인 매체를 이용하는 방법을 권장하고 있으며 그렇게 갈 것이라고 생각됩니다. 이에 대한 설명은 추후 추가하도록 하겠습니다.

인증서는 표준양식에 의해 생성된 전자문서의 일종입니다. 인증서 표준양식은 국제적인 호환성을 위해 사실상의 국제표준문서인 RFC 에 의해 규격이 정해져 있습니다. 약간 이상하게 들릴 수도 있겠지만, 규격으로 정해진 인증서의 본래의 용도는 개인키 소유여부의 확인이며, 본인확인 기능은 없습니다. 무슨 말이냐 하면 전자서명을 해서 상대방에게 보내면 "전자서명을 한 사람이 접니다" 라는 의사를 표시하는 것이지 그 "저"가 누구인지는 며느리도 모른다는 뜻이지요. 즉 인감증명서에 주민등록번호가 빠져 있는 것과 똑 같다는 뜻입니다. 이런 연유로 인해 우리나라의 공인인증체계에서는 독특하게 인증서에 개인의 고유한 식별정보(주민등록번호)를 간접적(!)으로 포함하여 이 기능을 통해 본인확인을 할 수 있는 것입니다. 눈치채신 분들도 계실지 모르겠지만, 이러한 연유로 국제표준 규격으로 제작된 인증서 관련 프로그램이 우리나라의 공인인증서에 대해서는 제기능을 수행하지 못할 수도 있습니다.

공인인증서

공인인증서를 전용프로그램으로 본 화면

Posted by 카피캣
,

ASN.1과 인코딩 방법

인코딩 2007. 12. 21. 15:40

일상생활에서도 말이나 글로 의사소통을 할 때, 전달하고자 하는 정확한 의미를 전달하지 못할 때가 많습니다. 하물며 외국인과의 의사소통은 말할 나위도 없지요.

컴퓨터들끼리도 의사소통(통신)을 할 때, 이러한 문제가 자주 발생되곤 합니다. 보통 다른 종류의 컴퓨터들 간에는 인간으로 치자면 외국어에 필적할 만한 차이가 존재하기 때문이죠. 이러한 문제를 해결하기 위해 서로 다른 컴퓨터간에 통신을 할 때, 필수적으로 지켜야 할 규약들을 표준으로 제정하여 이를 따르게 함으로써 문제를 해결하곤 합니다. 지금 소개하고자하는 ASN.1(Abstract Syntax Notation One) 역시 이러한 표준 규격의 일종입니다.

ASN.1은 주로 전달하고자 하는 의미를 명확히 규정하여 모호함을 없애기 위한 것이 그 주요한 기능이라고 요약할 수 있습니다.

가령 제가 여러분에게 "82.53" 라고 적은 것을 아무런 부연 설명없이 보낸다면 여러분은 제가 보낸 뜻을 정확히 이해하실 수 있으실까요? 82.53 라는 하나의 수를 보낸 것인지 82와 53이라는 두 수를 보낸 것인지 아니면 요즘 세대의 암호와도 같은 언어유희인 빨리오라는 말인지? 사람만이 그런 의미의 모호함을 만들 수 있는 것이 아니냐고요? 컴퓨터 세계에서도 이런 류의 모호함은 사람의 언어에 못지 않습니다.

컴퓨터는 모든 정보를 열림(On)과 닫힘(Off)의 세계, 즉 2진수의 체계로서 이해합니다. 이를 확장하여 컴퓨터가 처리하게 쉽게 또는 사람이 이해하기 쉽게 8개의 단위로 묶어 바이트(Byte, 8비트)라는 체계가 생성되었고 CPU의 특성과 같이 바이트에 대해 2의 승수를 차례로 곱한 수의 체계(8, 16, 32, 64, 128비트 ...)로 발전하고 있습니다. 따라서 같은 숫자라고 하더라도 컴퓨터 마다 이해하는 바가 다릅니다. 음의 정수 표현방법, 실수(Real Number)의 표현방법, 문자의 표현방법 등등 헤아릴 수 없이 많은 미묘한 차이를 가지고 있습니다.

ASN.1 에 따라 정의된 것은 컴퓨터가 표현하는 방법과는 상관없이 그 자체로서 의미를 명확하게 전달하는 방법인 것입니다. 따라서 컴퓨터 내에서 처리하는 방법은 ASN.1 과 별도이므로 그 컴퓨터에 가장 효율적인 어떤 방법으로 구현되어도 무관하나, 컴퓨터 간에 전달하는 메시지는 ASN.1이 정하는 규칙에 따라 그 의미를 이해하기만 하면 모호함 없이 명확히 전달할 수 있습니다.

ASN.1 은 각종 표준 문서에 널리 이용되고 있으며, 공인인증과 관련된 각종 문서에서는 예외없이 ASN.1 이 사용되고 있다고 해도 과언이 아닙니다.

아래는 인증서를 정의한 ASN.1 의 일부 내용입니다. 언뜻 보기에는 C 또는 파스칼 언어 같지 않나요? ASN.1 의 표기방법은 구조적인 언어에서 구조체를 표현하는 방식과 거의 유사합니다.

Certificate  ::=  SEQUENCE  {
     tbsCertificate       TBSCertificate,
     signatureAlgorithm   AlgorithmIdentifier,
     signature            BIT STRING  }

TBSCertificate  ::=  SEQUENCE  {
     version         [0]  Version DEFAULT v1,
     serialNumber         CertificateSerialNumber,
     signature            AlgorithmIdentifier,
     issuer               Name,
     validity             Validity,
     subject              Name,
     subjectPublicKeyInfo SubjectPublicKeyInfo,
     issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,
                          -- If present, version shall be v2 or v3
     subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,
                          -- If present, version shall be v2 or v3
     extensions      [3]  Extensions OPTIONAL
                          -- If present, version shall be v3 --  }

ASN.1 은 의미를 명확히 규정하는 것이라고 하였으므로, 그 의미를 실제의 어떤 값으로 표시하는 방법과는 차이를 가지고 있습니다. 그 의미를 컴퓨터에 무관하게 실제의 어떤 값으로 표시하는 방법을 ASN.1 인코딩 방법이라고 합니다. 인코딩 방법에는 BER(Basic Encoding Rules), CER(Canonical Encoding Rules), DER(Distinguished Encoding Rules), PER(Packed Encoding Rules) 등이 있습니다.

ASN.1과 인코딩 방법
Posted by 카피캣
,

대칭키 알고리즘과는 달리 서로 다른 두 개의 열쇠를 사용하는 새로운 자물쇠가 있다고 가정해 보겠습니다. 이 자물쇠는 두 개의 열쇠 중 하나로 잠그면, 반드시 잠근 것과는 다른 열쇠로만 열 수 있습니다. 즉 첫 번째 열쇠로 잠근 것은 두 번째 열쇠로만 열 수 있고, 두 번째 열쇠로 잠근 것은 첫 번째 열쇠로만 열 수 있습니다.

어떤 사람이 자신의 집 현관에 이 자물쇠가 설치된 편지함과 첫 번째 열쇠를 함께 놓아두고 두 번째 열쇠는 편지함 주인인 자신이 가진다고 가정해보겠습니다. 누구라도 편지함 주인에게 비밀편지를 보내려고 하면 편지함에 편지를 넣고 첫 번째 열쇠로 잠그기만 하면 됩니다. 첫 번째 열쇠로 잠갔기 때문에 두 번째 열쇠를 가진 편지함 주인 이외에 어떤 사람도 편지함을 열지 못합니다. 따라서 누구라도 편지함 주인에게 비밀편지를 보낼 수 있는 것입니다. 이와는 반대로 편지함 주인이 편지를 써서 편지함에 넣고 두 번째 열쇠로 잠근다면 외부인 중 누구라도 첫 번째 열쇠로 열어볼 수 있고 편지함 주인이 편지를 쓴 것이라는 확신을 가질 수 있을 것입니다. 첫 번째 열쇠로 열린다는 것은 두 번째 열쇠로 잠갔다는 것을 의미하며, 이 열쇠는 주인만이 가지고 있기 때문입니다.

공개키 알고리즘은 이와 같은 특성을 가지는 두 개의 키가 존재하는 암호 알고리즘입니다. 첫 번째 열쇠와 같이 외부인 누구에게나 공개되어 있는 것을 공개키라고 하고, 두 번째 열쇠와 같이 외부에는 알리지 않고 자신만 보관하고 있어야 하는 것을 개인키라고 합니다. 대칭키 알고리즘과는 달리 비밀을 공유하려는 사람들 간에 공유하게 되는 동일한 키가 없으며, 외부에 공개되는 키가 존재하는 특징 때문에 보통 공개키 알고리즘이라고 합니다.

공개키 암호 방식

공개키 암호 방식

공개키 알고리즘은 문서를 공개키로 암호화하느냐, 개인키로 암호화하느냐에 따라서 활용되는 분야가 확연히 차이가 납니다. 공개키로 암호화한 경우에는 개인키 소유자만이 복호화할 수 있기 때문에 암호로서 효용성을 가집니다. 반면에 개인키로 암호화하는 경우에는 누구나 복호화할 수 있기 때문에 암호로서의 활용은 불가능합니다. 대신 개인키 소유자만이 문서를 암호화할 수 있기 때문에 암호문 작성자를 알리기 위한 용도로 사용되며, 이를 암호화라는 말 대신 전자서명이라고 합니다. 우리나라 공인인증체계의 근간을 이루는 전자서명법은 공개키 알고리즘의 두 용도 중에서 전자서명만 규정하고 있으며, 문서 암호화에 대해서는 규정하지 않고 있습니다. 따라서 전자서명법에서는 개인키를 전자서명생성정보라고 정의하고 공개키를 전자서명검증정보라고 정의하고 있습니다.

공개키 알고리즘은 대칭키 알고리즘과는 달리 공개키와 개인키가 상호작용을 하여 암호화와 복호화를 수행하는 만큼 둘 사이에 상당히 복잡한 수학적 관계가 있으리라는 것은 쉽게 눈치챌 수 있을 것입니다. 공개키 알고리즘이 실제 어떤 수학적인 원리를 이용하는지 살펴보도록 하겠습니다.

공개키 알고리즘 중에서 가장 잘 알려져 있는 RSA 알고리즘은 서로 다른 두 소수의 곱의 형태로 표시되는 큰 수를 원래의 두 소수로 소인수분해하는 것이 어렵다는 문제에 기반하여 설계되었습니다. 서로 다른 두 소수 p q 를 선택하여 두 소수를 곱한 것을 n , 두 소수보다 1씩 작은 것을 곱한 수를 Ф(n) 이라 하고 이를 식으로 표현하면 n = pqФ(n) = (p-1)(q-1) 이 됩니다. 다음으로 1 보다 크고 Ф(n) 보다 작은 정수 중에서 Ф(n) 과 서로소가 되는 e 를 선택합니다. 마지막으로 e d 를 곱하여 Ф(n) 으로 나눈 나머지가 1 이 되는 d 를 구합니다. 이를 만족하는 n e공개키라 하고, d 개인키라고 합니다.

그렇다면 두 소수 p q 를 모를 경우, 공개키 ne 로부터 개인키 d 를 얼마나 빨리 구해낼 수 있을까요? n 이 두 소수 p q 의 곱으로 구성되어 있다는 것을 알고 있으므로, n 을 소인수분해하여 p q 를 구할 수만 있다면 d 를 계산할 수 있을 것입니다. 하지만 소수 p , q 가 충분히 크다면 두 소수의 곱으로부터 원래의 두 소수를 찾는 것은 매우 어려운 일이라고 합니다. 300자리 이상의 정수를 소인수분해하는 것은 2027년 이후에나 가능하다는 연구결과가 있습니다. 또한 소인수분해를 하지 않고 공개키 ne 로부터 개인키 d 를 구하는 방법은 아직 알려진 바가 없습니다.

방금 구한 공개키와 개인키로 전자서명과 전자서명검증을 어떻게 수행하는지 살펴보도록 하겠습니다. 전자서명할 문서를 m 이라고 하고 전자서명을 수행한 결과값을 c 라고 하면 다음과 같은 식으로 전자서명 과정과 전자서명검증 과정을 표현할 수 있습니다.

   전자서명과정      c = md mod n

   전자서명검증과정 m = ce mod n

증명

ed 를 곱하여 Ф(n) 으로 나눈 나머지가 1이 되므로 다음 식이 성립합니다.
    ed  =  k Ф(n) + 1        ……(1)
오일러의 totient 함수에 의하면 다음 식이 성립합니다.
    mФ(n)  mod n  =  1        ……(2)

ce  mod n ≡ (md)e  mod n
               ≡ med  mod n                 ← 계산식(1)을 대입하면
               ≡ mkФ(n)+1 mod n
               ≡ (mФ(n))km  mod n       ← 계산식(2)를 대입하면
               ≡ 1km  mod n
               ≡ m

현재까지 알려진 전자서명을 위한 공개키 알고리즘은 방금 설명한 소인수분해의 어려움에 기반을 둔 RSA 알고리즘 외에도 유한체의 이산대수 문제의 어려움에 기반을 둔 DSA 알고리즘과 KCDSA 알고리즘, 타원곡선 상의 이산대수 문제의 어려움에 기반을 둔 ECDSA 알고리즘 등이 있습니다. 이 중에서 KCDSA 알고리즘은 국산 알고리즘입니다.

우리나라 공인인증체계에서는 RSA 알고리즘을 주로 사용하며, 제한적인 환경에서 ECDSA와 KCDSA를 사용할 수 있습니다.

개별 공개키 알고리즘 부연설명

  1. RSA는 1977년 R. Rivest, A. Shamir, L. Adleman 3명의 수학자에 의해 개발된 알고리즘으로 RSA는 이들의 머릿글자를 따서 지어졌으며, RSA Security사가 소유권을 가지고 있습니다.
  2. DSA(Digital Signature Algorithm)는 미국 국립표준기술연구소(NIST)에서 개발되었으며, 2000년 1월 미국 전자서명 표준(FIPS 186-2)으로 승인되었습니다.
  3. KCDSA(Korean Certificate-based Digital Signature Algorithm)는 한국통신정보보호학회의 주관 하에 국내 암호학자들이 주축이 되어 1996년 11월에 개발되었으며, 1998년 10월에 국내 표준(TTA.KO-12.0001)으로 제정되었습니다.
  4. ECDSA(Elliptic Curve Digital Signature Algorithm)는 DSA 전자서명을 타원곡선을 이용한 전자서명 알고리즘으로 변형한 것으로 2000년 1월 미국 전자서명 표준(FIPS 186-2)으로 승인되었습니다.

Posted by 카피캣
,

연인 사이인 두 사람이 다른 사람 몰래 편지를 주고받기로 하고 자물쇠가 달려있는 작은 상자와 이를 열 수 있는 열쇠를 각자 하나씩 가지고 있다고 가정해 보겠습니다. 두 사람은 서로에게 보낼 편지를 써서 상자에 넣은 후 자물쇠를 잠그고 보낸다면 열쇠를 가지고 있는 두 사람만이 비밀편지를 볼 수 있겠지요? 중간에 누군가가 상자를 가로챈다고 하더라도 열쇠를 가진 두 사람 이외에는 누구도 상자를 열어볼 수 없기 때문에 비밀편지 내용은 누설되지 않게 될 것입니다.

대칭키 알고리즘은 기본적으로 이러한 상황과 거의 유사합니다. 전자문서(비밀편지)가 대칭키(열쇠)로 암호화되면 똑같은 대칭키를 가지고 있는 상대방만이 이 전자문서를 복호화할 수 있으며, 누군가가 암호화된 전자문서를 입수하여도 이를 복호화하지는 못하기 때문에 입수한 사람에게는 아무 의미가 없는 문서가 될 뿐입니다.

대칭키 암호 방식

대칭키 암호 방식

군사적인 목적이든 개인적인 목적이든 은밀한 편지를 보내고자 하는 인간의 욕구는 동서고금을 막론하고 항상 존재하였던 것으로 이해할 수 있습니다. 고대 스파르타시대에 사용된 것으로 알려지는 스키탈레 암호법 이래로 1970년대 공개키 알고리즘이 등장하기 전까지 암호라고 하면 대부분 대칭키 알고리즘을 의미하는 것이었습니다. 오늘날 컴퓨터로 계산하는 대칭키 알고리즘은 고도로 어려운 수학적 방법 같은 것을 사용하는 것이 아니고 이전까지 손으로 계산하여야 했던 여러 과정을 복잡하게 재구성한 것에 지나지 않는다고 볼 수 있습니다.

대칭키 알고리즘에 사용되는 키는 대칭키, 단일키, 공용키, 관용키 등과 같은 여러 가지 이름이 있지만 키를 바라보는 시각의 차이일 뿐 모두 동일합니다. 대칭키 알고리즘에서는 미리 약속된 대칭키를 사용하지 않을 경우 암호문과 대칭키를 함께 보낼 수 없기 때문에 암호문을 전달하는 경로와는 다른 경로로 대칭키를 안전하게 전달하여야 합니다. 암호학에서는 대칭키를 전달하는 것을 대칭키 교환 또는 키 교환이라고 하며, 적절한 대칭키 교환 방법이 대칭키 알고리즘을 활용하는 데 있어 가장 어려운 문제의 하나입니다.

앞의 비밀편지의 예에서 다음과 같은 생각을 하는 사람이 있을 지도 모릅니다. 비밀상자를 가로챈 사람이 지구상에 존재할 수 있는 모든 열쇠를 가지고 있다고 한다면 얼마나 빨리 상자를 열 수 있을까요? 지구상에 서로 다른 열쇠가 1만개 있고 한번 열기를 시도하는데 1초씩 걸린다고 가정하면 평균적으로 83분 정도면 해당 열쇠를 찾을 수 있습니다. 대칭키 알고리즘에도 똑같은 상황을 적용할 수 있을까요? 그렇습니다. 비밀편지와 유사한 사상에서 출발하였기 때문에 대칭키 알고리즘도 같은 상황에 직면할 수 있으며, 오히려 누구나 간단하게 키를 만들 수 있기 때문에 어떤 면에서는 상자 열기보다 더 위험에 처할 수 있습니다. 이 경우에는 키의 갯수를 늘이는 방법으로 문제를 해결할 수 있습니다. 즉, 서로 다른 키가 1만개가 아니라 1억 개라면 같은 조건에서 열쇠를 찾는데에는 약 1년 6개월이 필요하기 때문입니다.

요즘 사용하고 있는 대칭키 알고리즘은 2128개( >1038) 정도의 서로 다른 키가 존재하기 때문에 같은 조건이라면 평균적으로 5×1030년이 걸릴 것입니다. 참고로 지구의 나이는 대략 4.6×109년(46억년) 정도 된다고 합니다.

대표적인 대칭키 알고리즘으로는 DES, triple-DES, RC4, IDEA, AES 등의 외산 알고리즘과 SEED, ARIA 등의 국산 알고리즘이 있습니다. 우리나라 공인인증체계에서는 SEED를 주로 사용하며 제한적인 부분에서 DES, triple-DES, RC4를 사용하고 있습니다.

  1. DES(Data Encryption Standard)는 1970년대 초 미국 상무부가 정부와 민간의 조달 등에서 사용할 목적으로 공개 모집된 것 중 IBM이 제안한 것을 미국 국가안전보장국(NSA)이 수정해 표준(FIPS PUB 46-2)으로 만든 알고리즘입니다.
  2. triple-DES는 DES의 키 길이가 짧은 약점을 보완하기 위해 DES 알고리즘을 동일하게 사용하면서 키를 2개 또는 3개 사용하여 한 번의 암호화과정에 DES암호화(첫 번째 키)-DES복호화(두 번째 키)-DES암호화(첫 번째 또는 세 번째 키)의 세 단계 DES 연산을 수행하는 알고리즘입니다.
  3. AES(Advanced Encryption Standard)는 미국 국립표준기술연구소(NIST)가 기존의 DES 알고리즘을 대체할 차세대 암호 표준을 공개 모집하여 선정한 알고리즘입니다. 공개 모집된 알고리즘 중에서 Rijndael 알고리즘이 최종적으로 AES로 선정되었으며, 2001년 11월 FIPS PUB 197로 표준화되었다. 지난 2005년 11월에는 ISO/IEC 국제표준화회의에서 국제표준으로 확정되었습니다.
  4. SEED는 민간부분에서 정보와 개인프라이버스 보호를 위해 한국정보보호진흥원(KISA)과 한국전자통신연구원(ETRI) 주도하에 개발된 대칭키 알고리즘입니다. 1999년 9월 국내 단체표준화(TTA.KO-12.0004)를 완료하였으며, 2005년 11월에는 ISO/IEC 국제표준화회의에서 국제표준으로 확정되었습니다.
  5. ARIA는 국가기관 및 지방자치단체간, 대국민 행정서비스 정보보호를 위해 국가정보원과 국가보안기술연구소(NSRI) 주도하에 학계, 연구소, 정부기관 공동연구로 개발된 대칭키 알고리즘입니다.
Posted by 카피캣
,

요즘 출판되는 책의 맨 뒷면을 보면 책마다 서로 다른 ISBN 번호가 인쇄되어 있는 것을 볼 수 있습니다. 책을 분류하는 것과 같은 관리 목적에서 이 ISBN 번호는 매우 유용하게 사용될 것입니다. 누군가가 어떤 책을 가지고 있다면 단지 책의 뒷면을 보는 것만으로도 쉽게 그 책의 ISBN 번호를 알 수 있습니다. 하지만 ISBN 번호를 알고 있다고 하더라도 컴퓨터나 분류표의 도움 없이 도서관에서 그 번호에 해당하는 책을 찾아내는 것은 대단히 어려운 일이 될 것입니다. 일반적으로 해쉬알고리즘은 ISBN과 같은 특성을 가지는 고정된 짧은 길이의 데이터로 생각할 수 있습니다.

책보다 좀 더 전산적인 관점으로 이동하여 정수의 범위에서 살펴보도록 하겠습니다. 해쉬알고리즘을 설명하기 위해 정수의 범위에서 살펴보는 이유는 우리가 표현할 수 있는 모든 전자적 형태의 문서(데이터)는 하나의 정수로 표현할 수 있기 때문입니다. "abcd" 라는 문자열 데이터는 1,633,837,924라는 정수로 표현할 수 있습니다. 1K바이트의 데이터라면 대략 2,400자리 정도의 정수로 표현될 것입니다. 해쉬알고리즘정수의 형태로 표현된 전자문서로부터 고정된 길이의 정수를 얻는 방법으로 통상적으로 계산합니다.

- 부연설명 -

문자열 "abcd"를 ASCII 방식으로 인코딩하면 { 0x61, 0x62, 0x63, 0x64 } 가 됩니다. 이를 연접하면 16진수 값 0x61626364 또는 10진수 값 1,633,837,924 의 정수로 표현할 수 있습니다. 1,024 바이트의 데이터를 정수 n이라고 하면 n < 2 ^ (8 * 1024) 가 됩니다. 따라서, n의 자리수 = log(n) < log(2 ^ (8 * 1024)) = 8 * 1024 * log(2) = 2466.04 가 되어 10진수로 최대 2467 자리 정수가 만들어집니다.

정수의 형태로 표현된 전자문서의 개념을 파악하였다면, 이로부터 고정된 길이의 정수를 얻는 방법에 대해 살펴보겠습니다. 임의의 정수로부터 고정된 길이의 정수를 얻는 가장 간단한 방법으로 정수를 특정한 값으로 나눈 나머지를 구하는 것을 생각해 볼 수 있습니다. 모든 정수의 나머지 연산에 대한 결과값은 0 ~ [제수-1] 의 값에 반드시 포함되므로 [제수-1]에 해당하는 고정된 길이의 정수를 얻게되는 것입니다.

- 부연설명 -

위에서 살펴본 방법으로 해쉬알고리즘을 하나 간단하게 설계해 보도록 하겠습니다. 정수를 10 으로 나눈 나머지를 계산하는 방법을 새로 설계한 해쉬알고리즘이라고 하겠습니다. 우리가 어떤 정수(가령 위에서 예를 든 1,633,837,924)를 가지고 있다고 하면 10으로 나눈 나머지 값(4)은 금방 계산해 낼 수 있습니다. 하지만 특정한 나머지 값(4)로 부터 우리가 처음 가지고 있던 그 정수를 유추해 내는 것은 거의 불가능합니다.

해쉬알고리즘이 되기 위해서는 위에서 나열한 기본적인 요건 이외에도 또 다른 중요한 문제가 남아 있습니다. 나머지 연산의 경우 비록 특정한 나머지 값으로부터 처음 가지고 있던 정수를 유추하는 것은 불가능하다고 할지라도 같은 나머지 값을 가지는 무수히 많은 정수를 찾을 수 있다는 점입니다. ISBN의 예로 돌아가서 같은 ISBN 번호를 가지는 서로 다른 책이 무수히 많이 존재한다면 이는 관리상 엄청난 문제를 야기할 것이 틀림없습니다. 이렇게 해쉬알고리즘을 수행한 결과값과 같은 결과 값을 가지는 다른 데이터를 발견하였을 경우 이를 해쉬알고리즘에서 충돌(Hash Collision)이 발생하였다고 합니다. 값의 범위가 무한대인 정수값을 고정된 크기의 작은 정수로 줄이는 것이기 때문에 해쉬알고리즘의 충돌은 필연적으로 발생할 수 밖에 없습니다. 다만 이를 충분히 어렵게 하여 충돌이 발생하는 것을 찾아내는 것이 시간상으로나 비용상 불가능하게 만드는 것해쉬알고리즘을 설계하는 가장 기본적인 원칙입니다. 잘 설계된 해쉬알고리즘은 다음과 같은 특성을 가집니다.

  1. 해쉬알고리즘은 어떤 크기의 입력도 받아 들일 수 있어야 한다.
  2. 해쉬알고리즘의 계산 결과는 고정된 길이의 정수로 나타난다.
  3. 해쉬알고리즘은 주어진 입력으로부터 쉽게 계산 결과를 얻을 수 있어야 한다.
  4. 해쉬알고리즘의 계산 결과가 주어졌을 때, 원래의 입력 값을 찾는 것이 계산 불가능해야 한다. [일방향성]
  5. 어떤 입력 값이 주어졌을 때, 같은 계산 결과를 얻을 수 있는 다른 입력 값을 찾는 것이 계산 불가능해야 한다. [약한 충돌회피성]
  6. 같은 계산 결과를 얻을 수 있는 임의의 서로 다른 두 입력 값을 찾는 것이 계산 불가능해야 한다. [강한 충돌회피성]

해쉬알고리즘이 갖추어야 할 여섯 가지 특성 중에서 처음 셋은 기본적 특성을 정리한 것입니다. 임의의 정수를 입력으로 받아야 하므로 입력의 크기에 제한을 받아서는 안되며 고정된 길이는 앞에서 설명한 것과 같습니다. 빠른 계산 속성은 필요요건이라기 보다 요구사항으로 판단하시면 될 것입니다.

네 번째 항목은 일방향 특성을 나타냅니다. 고정된 길이의 작은 정수로 매핑하는 것이므로 해쉬결과값으로부터 원래의 데이터를 찾는 것이 불가능함은 당연한 내용입니다.

다섯 번째 항목과 여섯 번째 항목은 모두 해쉬 알고리즘의 충돌을 얼마나 방지할 수 있는가에 관한 내용으로 얼핏 비슷한 말처럼 보이기도 합니다. 일반적으로 다섯 번째 항목의 조건을 완화한 것이 여섯 번째 항목에 해당되는 것입니다. 특정한 경우에 해당하는 것을 찾는 것보다 일반적인 법칙을 찾는 것이 어렵듯이, 다섯 번째 항목의 충돌을 찾아내는 것 보다는 여섯 번째 항목의 충돌을 찾는 것이 훨씬 쉽습니다. 이는 여섯 번째 조건을 만족하는 것이 다섯 번째 조건만을 만족하는 것보다 해쉬충돌의 방지라는 면에서 훨씬 강력하다는 것을 의미합니다. 일반적으로 다섯 번째 해쉬알고리즘의 특성을 약한 충돌회피성(Weak Collision Resistance)이라고 하고 여섯 번째 해쉬알고리즘의 특성을 강한 충돌회피성(Strong Collision Resistance)이라고 합니다. 해쉬알고리즘의 충돌회피성에 관해서는 따로 설명하도록 하겠습니다.

해쉬알고리즘은 앞에서 설명한 대칭키 알고리즘과 공개키 알고리즘에 비해 상대적으로 덜 알려져 있지만, 사용빈도 및 중요성은 위의 두 알고리즘 보다 높습니다. 약한 충돌회피성이 있기 때문에 원래의 데이터가 위변조 되었는지 확인하기 위한 용도로 많이 사용되며 원래의 데이터를 대표할 수 있는 고정된 크기의 값이기 때문에 서명 등의 용도로 활용됩니다. 부가적으로 난수 생성이나 메시지 인증코드 등에서 활용되고 있습니다. 대표적인 해쉬알고리즘으로는 MD5, SHA-1, SHA-2 등의 외산 알고리즘과 HAS-160의 국산 알고리즘이 있습니다. 공인인증체계에서는 SHA-1을 주로 사용하며 부분적으로 HAS-160을 사용할 수 있도록 되어 있습니다.

Posted by 카피캣
,