본문 바로가기

보안/시큐어코딩

웹에서 사용되는 인코딩 종류와 암호화 알고리즘

인코딩


문자 인코딩(character encoding)은 문자들의 집합을 컴퓨터에서 저장하거나 통신에 사용할 목적으로 부호화하는 방법을 가리키며, 그냥 인코딩이라고도 불린다. 


대표적인 예로 전건을 길게, 또는 짧게 두드려서 라틴 알파벳을 나타내는 모스 부호가 있으며, 라틴 알파벳, 숫자, 특수 문자 등을 정수와 그에 대응되는 7비트 이진수로 표현하는 방법인 ASCII가 있다.


ASCII :

       미국정보교환표준코드. 7bit 사용. 0~127까지 128개 문자로 구성


MS-Script: 

       MS에서 제공하는 인코딩 기법으로 IE에서만 사용가능하다.


Base64 Encoding: 

       8비트이진데이터(실행파일, 압축파일 등)를 문자코드에 영향을 받지 않는 공통 ASCII영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식


URL Encoding:  

       URL에 포함될 문자들이 안전하게 웹페이지에 전달 될 수 있도록 특수한 기능을 가진 문자들을 브라우저가 인코딩. URL META문자에 대한 인코딩이 필요하며, 기존 문자열의 HEX값앞에 %를 사용한다. 한글은 UTF-8 사용.


Force Full URL Encoding: 

       모든 문자열을 강제로 인코딩 한다. 



암호화 알고리즘



암호화의 목적:

      1. 기밀성: 사용자의 중요정보를 아무나 읽지 못하도록 보호한다.

        2. 무결성: 사용자의 중요정보를 아무나 변경하지 못하도록 보호한다.

        3. 인증: 데이터가 특정인으로 부터 온 것임을 보장한다.


 

블록암호화: 

 

       기밀성이 요구되는 정보를 정해진 블록 단위로 암호키를 사용하여 암호화한다.  암호화 하는 키와 복호화하는 키가 동일하므로  대칭키 암호화라고 부른다.  블록암호화에서 암호화를 수행하는 방식을 5가지로 분류할 수 있다. 

       암호화 모드: ECB, CBC, OFB, CFB, CTR   <-- 아래 상세한 블록암호화 운영모드 설명 참조

 

     


해쉬함수: 

      해시 함수(hash function) 또는 해시 알고리즘(hash algorithm)은 임의의 데이터로부터 일종의 짧은 "전자 지문"을 만들어 내는 방법이다. 해시 함수는 데이터를 자르고 치환하거나 위치를 바꾸는 등의 방법을 사용해 결과를 만들어 내며, 이 결과를 흔히 해시 값(hash value)이라 한다. 


        해시 함수는 결정론적으로 작동해야 하며, 따라서 두 해시 값이 다르다면 그 해시값에 대한 원래 데이터도 달라야 한다. (역은 성립하지 않는다) 해시 함수의 질은 기대되는 입력 영역에서 얼마나 적은 해시 충돌(서로 다른 두 데이터의 해시 값이 같은 경우)을 일으키느냐로 결정되는데, 충돌이 많이 날수록 서로 다른 데이터를 구별하기 어려워지고 데이터를 검색하는 비용을 늘리기 때문이다.


공개키 암호: 

      공개 키 암호 방식 사전에 비밀 키를 나눠가지지 않은 사용자들이 안전하게 통신할 수 있도록 한다. 공개 키 암호 방식에서는 공개 키와 비밀 키가 존재하며, 공개 키는 누구나 알 수 있지만 그에 대응하는 비밀 키는 키의 소유자만이 알 수 있어야 한다. 공개 키 암호를 구성하는 알고리즘은 대칭 키 암호 방식과 비교하여 비대칭 암호(非對稱暗號)라고 부르기도 한다.

공개 키 암호 방식은 크게 두 가지 종류로 나눌 수 있다.

  • 공개 키 암호 — 특정한 비밀 키를 가지고 있는 사용자만 내용을 열어볼 수 있음.
  • 공개 키 서명 — 특정한 비밀 키로 만들었다는 것을 누구나 확인할 수 있음.


공개 키 암호 방식은 열쇠로 잠겨 있고 좁은 투입구가 있는 편지함에 비유할 수 있다. 이런 편지함은 위치(공개 키)만 알면 투입구를 통해 누구나 편지를 넣을 수 있지만 열쇠(개인 키)를 가진 사람만이 편지함을 열어 내용을 확인할 수 있다.

공개 키 서명은 인장으로 편지봉투를 봉하는 것에 비유할 수 있다. 이렇게 봉한 편지는 누구나 열어볼 수 있지만 인장을 통해 인장의 주인이 편지를 보냈음을 증명할 수 있다.

일반적으로, 공개 키 암호 방식은 비밀 키 암호보다 계산이 복잡한 단점이 있기 때문에, 효율을 위해 비밀 키 암호(혹은 대칭 암호)와 함께 사용된다. 메시지를 임의로 만들어진 비밀 키를 이용해 암호화한 다음 이 비밀 키를 다시 수신자의 공개 키로 암호화하여 메시지와 함께 전송하는 것이다. 이렇게 하면 공개 키 암호 기술로는 짧은 비밀 키만을 암호화하고 보다 효율적인 비밀 키 암호 기술로 전체 메시지를 암호화하므로 양쪽의 장점을 취할 수 있다.  <출처: 위키백과>


전자서명: 

       서명자를 확인하고 서명자가 당해 전자문서에 서명을 하였음을 나타내는 데 이용하기 위하여 당해 전자문서에 첨부되거나 논리적으로 결합된 전자적 형태의 정보를 말한다.

  • 공개 키 기반 구조(PKI) 기술측면에서 전자서명이란 전자문서의 해시(HASH)값을 서명자의 개인키(전자서명생성정보)로 변환(암호화)한 것으로서 RSA사에서 만든 PKCS#7 의 표준이 널리 사용되고 있다.

즉, 원래의 문서 내용을 A라고 하면 A의 해쉬 값을 잘 알려진 Hash 함수인 SHA1 같은 함수 하나를 정해 이런 Hash함수로 문서 A의 Hash 값을 구하고 이 Hash 값을, 보내는 사람(철수)의 Private Key 로 암호화 한다. 이런 다음 이렇게 암호화된 Hash값을 원래 문서 A 끝에 첨부하여 이 문서 전체를 받는 사람(영희)에게 보낸다.

영희는 먼저 메세지가 오면 해쉬값을 뺀 앞부분의 문서에 대해 철수가 사용했던 Hash함수를 이용해 받은 문서의 Hash값을 구한다. 그 다음 문서 뒤에 달린 암호화된 Hash값을 철수의 Public Key로 복호화한 다음 이 복호화된 Hash값을, 받은 문서의 Hash값과 비교하게된다. 이 두개의 Hash값이 동일한 값이면 서명이 올바른 것이고 값이 서로 다르거나 변환에 오류가 있으면 서명이 틀린 것이다.

  • 전자서명은 수기서명과 동일한 효력을 지닌다.  <출처: 위키백과>

키설정방식:

     디피-헬만 키 교환(Diffie–Hellman key exchange)은 암호 를 교환하는 하나의 방법으로, 두 사람이 암호화되지 않은 통신망을 통해 공통의 비밀 키를 공유할 수 있도록 한다. 휫필드 디피 마틴 헬만이 1976년에 발표하였다.

디피-헬만 키 교환은 기초적인 암호학적 통신 방법을 수립하였으며, 이후 1977년 공개 키 암호 방식 RSA 암호가 제안되었다.  <출처: 위키백과>



NIST, ECRYPT 등 암호전문기관의 안전한 암호화 알고리즘 권고





<<참고>> 블록암호운영모드에 대한 상세 설명



출처: http://yoyojyv.tistory.com/41


1. ECB (Electronic Code Block) Mode
- 가장 단순한 모드로 블록단위로 순차적으로 암호화 하는 구조이다.
- 한개의 블록만 해독되면 나머지 블록도 해독이 되는 단점이 있다. (Brute-Force Arttack, Dictionary Attack)
- 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 알기 위해서 Padding을 해야한다.


- error propagation : 각 블록이 독립적으로 동작하므로 한블록에서 에러가 난다고 해도 다른 블록에 영향을 주지 않는다. 해당 블록까지 에러 전파.


2. CBC(Cipher Block Chaining) Mode
- 블록 암호화 운영 모드 중 보안 성이 제일 높은 암호화 방법으로 가장 많이 사용된다.
- 평문의 각 블록은 XOR연산을 통해 이전 암호문과 연산되고 첫번째 암호문에 대해서는 IV(Initial Vector)가 암호문 대신 사용된다. 이 때, IV는 제 2의 키가 될수 있다.
- 암호문이 블록의 배수가 되기 때문에 복호화 후 평문을 얻기 위해서 Padding을 해야만 한다.
암호화가 병렬처리가 아닌 순차적으로 수행되어야 한다. (단점이죵~)


- error propagation : 깨진 암호문의 해당블록과 다음블록의 평문까지 영향을 미치게 됩니다. 두번째 복호화 그림을 보고 Ciphertext가 깨졌을 때를 생각해보시면 이해가 되실꺼에요~


3. CFB(Cipher FeedBack) Mode
- 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같다(패딩이 필요 없다)
- 최초의 키생성 버퍼로 IV가 사용되며, 이때 IV는 제2의 키가 될수 있다.
스트림의 기본단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 CFB8~CFB128로 쓰인다.
암호화, 복호화 모두 암호화로만 처리할 수 있다.
- CBC모드와 마찬가지로 암호화는 순차적이고, 복호화는 병렬적으로 처리할 수 있다. 


- error propagation : CBC모드와 마찬가지로 한 암호문블럭의 에러는 해당평문블록과 다음 평문블록, 이렇게 총 2개의 블록에 전파된다.


4. OFB(Output FeedBack) Mode
- 블록 암호화를 스트림 암호화처럼 구성해 평문과 암호문의 길이가 같다.(패딩이 필요없다)
- 암호화 함수는 키 생성에만 사용되며, 암호화 방법과 복호화 방법이 동일해 암호문을 한번 더 암호화하면 평문이 나온다. (복호화시에 암호화)
- 최초의 키생성 버퍼로 IV가 사용되며, 이 때 IV는 제2의 키가 될수 있다.
스트림의 기본 단위를 Bit단위로 설정할 수 있으며, Bit단위에 따라 OFB8~OFB128로 쓰인다.


- error propagation : 해당블록까지만~ 대응되는 한 블록에만 영향을 미치므로, 영상이나 음성과 같은 digitized analog신호에 많이 사용된다.


5. CTR (CounTeR) Mode
- 블록을 암호화할 때마다 1씩 증가해 가는 카운터를 암호화 해서 키스트림을 만든다. 즉 카운터를 암호화한 비트열과 평문블록과의 XOR를 취한 결과가 암호문 블록이 된다.
- CTR모드는 OFB와 같은 스트림 암호의 일종이다.
- CTR모드의 암복호화는 완전히 같은 구조가 되므로 구현이 간단하다.(OFB와 같은 스트림 암호의 특징)
- CTR모드에서는 블록의 순서를 임의로 암/복호화 할 수있다.(비표와 블록번호로부터 카운터를 구할 수 있기때문에)
- 블록을 임의의 순서로 처리 할 수 있다는 것은 처리를 병행 할 수 있다는 것을 의미한다.(병렬처리 가능)


- error propagation : 각 블록이 병렬처리 되므로 같은 블록내에서만 이루어짐.

표준 대칭키 알고리즘의 종류

알고리즘

특징

소유국가

DES

64bit block

56bit key

미국

Triple DES

64bit block

112~168bit key

미국

BlowFish

64bit block

128bit key

미국

RC2

64bit block

128bit key

미국

RC4

Stream Cipher

미국

AES

128bit block

128~256 bit key

벨기에

SEED

128bit block

128bit key

한국

ARIA

128bit block

128~256bit key

한국



*Stream Cipher : 키의 길이가 유동적이며, 키의 길이가 길수록 안전성이 뛰어남.