인코딩

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) 등이 있습니다.