검수요청.png검수요청.png

"복호화"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
(종류)
잔글
 
(사용자 2명의 중간 판 5개는 보이지 않습니다)
1번째 줄: 1번째 줄:
 
+
'''복호화'''(decryption) 또는 '''디코딩'''(decoding)은 [[부호화]](encoding)된 정보를 부호(code)화되기 전으로 되돌리는 처리 혹은 그 처리 방식을 말한다. '''역암호화'''<!--역 암호화-->라고도 한다. 보통은 부호화의 절차를 역으로 수행하면 복호화가 된다. [[암호화]](encryption)의 반대말로서의 복호화는 decryption이라고 부른다. 영어로는 decoding과 decryption이 구분되지만 한국어로는 구분이 되지 않는다. 한편 복호기 또는 디코더(decoder)는 복호화를 수행하는 장치나 회로, 컴퓨터 소프트웨어, 알고리즘 또는 사람을 말한다.<ref>〈[https://ko.wikipedia.org/wiki/%EB%B3%B5%ED%98%B8%ED%99%94 복호화]〉, 《위키백과》</ref>
[[복호화]] 또는 [[디코딩]](decoding)은 [[부호화]](encoding)된 정보를 부호(code)화되기 전으로 되돌리는 처리 혹은 그 처리 방식을 말한다. 보통은 부호화의 절차를 역으로 수행하면 복호화가 된다.
 
 
 
[[암호화]](encryption)의 반대말로서의 복호화는 decryption이라고 부른다.
 
 
 
영어로는 decoding과 decryption이 구분되지만 한국어로는 구분이 되지 않는다.
 
 
 
한편 복호기 또는 디코더(decoder)는 복호화를 수행하는 장치나 회로, 컴퓨터 소프트웨어, 알고리즘 또는 사람을 말한다.
 
 
 
<ref>* 〈[https://ko.wikipedia.org/wiki/%EB%B3%B5%ED%98%B8%ED%99%94 복호화]〉, 《위키백과》</ref>
 
  
 
==개요==
 
==개요==
 
 
'''복호화'''(decryption)는 [[암호화]]된 [[데이터]]를 암호화되기 전의 형태로 바꾸는 처리를 말한다. 복호화는 [[암호화]](encryption, 인크립션)의 반대말로서 영어로 decryption(디크립션)이라고 부른다. 복호화는 [[디코딩]](decoding)과 유사하다.
 
'''복호화'''(decryption)는 [[암호화]]된 [[데이터]]를 암호화되기 전의 형태로 바꾸는 처리를 말한다. 복호화는 [[암호화]](encryption, 인크립션)의 반대말로서 영어로 decryption(디크립션)이라고 부른다. 복호화는 [[디코딩]](decoding)과 유사하다.
  
21번째 줄: 11번째 줄:
 
'''부호화의 역과정 (Decoding, 복호화)'''
 
'''부호화의 역과정 (Decoding, 복호화)'''
 
디지털 변조 및 복조 방식에서
 
디지털 변조 및 복조 방식에서
-복조(Demodulation) : 원래 파형의 복구(복제)한다.
+
* 복조(Demodulation) : 원래 파형의 복구(복제)한다.
-복호(Deoding/Detection/Decision) : 유효 부호어 또는 디지털 심볼의 결정한다.
+
* 복호(Decoding/Detection/Decision) : 유효 부호어 또는 디지털 심볼의 결정한다.
 
디지털 변조 파형의 복조 후에 심볼의 결정(판단) 과정이다.
 
디지털 변조 파형의 복조 후에 심볼의 결정(판단) 과정이다.
  
 
전송 채널 오류에 대처하는 기법에 대해서는,효율적 복호(디코딩)의 어렵다.
 
전송 채널 오류에 대처하는 기법에 대해서는,효율적 복호(디코딩)의 어렵다.
 
부호화(코딩)은 비교적 자연스럽게/일원적으로 제시되지만,
 
부호화(코딩)은 비교적 자연스럽게/일원적으로 제시되지만,
. 오류 섞인 수신 신호로부터 효율적으로 디코딩하는 것은 매우 어려운 과제이다.
+
* 오류 섞인 수신 신호로부터 효율적으로 디코딩하는 것은 매우 어려운 과제이다.
.. 특정 채널부호화 방식에서도 여러 디코딩 방식들이 제안되어왔었다.
+
* 특정 채널부호화 방식에서도 여러 디코딩 방식들이 제안되었다.
  
 
* A/D 변환의 역과정 (D/A Conversion, D/A 변환)
 
* A/D 변환의 역과정 (D/A Conversion, D/A 변환)
 
- 상대 전송장치에서 전송되어온 디지털 신호를 아날로그 신호로 변환하는 것이다.
 
- 상대 전송장치에서 전송되어온 디지털 신호를 아날로그 신호로 변환하는 것이다.
  
* 암호화의 역과정 (Decryption, 암호해독)
+
* 암호화의 역과정 (Decryption, 암호해독) : 역암호화이다.<ref>〈[https://namu.wiki/w/%EB%B3%B5%ED%98%B8%ED%99%94 복호화]〉, 《나무위키》</ref>
역 암호화이다.  
 
 
 
<ref> * 〈[https://namu.wiki/w/%EB%B3%B5%ED%98%B8%ED%99%94 복호화]〉, 《나무위키》 </ref>
 
  
 
==역사==
 
==역사==
 
+
암호학의 기원은 수천년 전부터 이뤄, 최근 수십 년까지의 기간을 일컫는다. 역사상 기록으로 남은 가장 오래된 암호는 율리우스 카이사르가 사용한 대입암호이다. 고대 그리스에서 사용되던 스키테일 암호체계도 있다. 이 시기의 암호화 기법을 고전 암호학이라 부르는데, 고전 암호학의 암호학 기법은 대체로 큰 차이가 없었다. 이런 고전 암호화 기법은 20세기 초에 이뤄서야 변화가 생겼는데, 이의 예로는 [[에니그마]](독일어:Enigma 뜻:수수께기)가 사용한 회전륜 가밀법이 대표적이다. 이후 전자요소와 계산기(컴퓨터)는 큰 발전을 이뤘으며, 이때 사용된 암호화 기법은 전통적인 사서통신에 쓰일 수 없게 되었다. 암호학의 발전은 암호분석학과 함께 발전했다. 즉 암호 편집과 가밀법에 대한 해독법을 말한다. 주로 가밀된 신호의 빈율을 분석하여 해석했는데, 이런 방법을 응용하여 해석된 암호문은 때때로 역사를 바꾸기도 했다. 예를 들어, 치머만 전보를 해석한 것은 미국이 1차 세계대전에 참전하게 되는 계기가 되었고, 동맹국이 나치의 암호문을 해석한 것은 2차 세계대전의 기간을 2년 정도 단축시켜 주기도 하였다. 20세기부터 70년대 이전에 암호학의 대부분은 정부의 안전범주에 속했지만, 공개표준키 체제의 탄생과 공개키 가밀법의 발명은 [[암호학]]을 대중영역에 접하게 하였다.<ref>〈[https://cloud.google.com/kms/docs/encrypt-decrypt?hl=ko#kms-howto-encrypt-cli 대칭 키로 데이터 암호화 및 복호화]〉, 《구글 클라우드》, 2019-06-31</ref>
암호학의 기원은 수천년 전부터 이뤄, 최근 수십 년까지의 기간을 일컫는다.역사상 기록으로 남은 가장 오래된 암호는 율리우스 카이사르가 사용한 대입암호이다. 고대 그리스에서 사용되던 스키테일 암호체계도 있다. 이 시기의 암호화 기법을 고전 암호학 이라 부르는데, 고전 암호학의 암호학 기법은 대체로 큰 차이가 없었다. 이런 고전 암호화 기법은 20세기 초에 이뤄서야 변화가 생겼는데, 이의 예로는 에니그마(독일어:Enigma 뜻:수수께기 )가 사용한 회전륜 가밀법이 대표적이다. 이후 전자요소와 계산기(컴퓨터)는 큰 발전을 이뤘으며, 이때 사용된 암호화 기법은 전통적인 사서통신에 쓰일 수 없게 되었다. 암호학의 발전은 암호분석학과 함께 발전했다. 즉 암호 편집과 가밀법에 대한 해독법을 말한다. 주로 가밀된 신호의 빈율을 분석하여 해석했는데, 이런 방법을 응용하여 해석된 암호문은때때로 역사를 바꾸기도 했다.예를 들어,치머만 전보를 해석한 것은 미국이 1차 세계대전에 참전하게 되는 계기가 되었고,동맹국이 나치의 암호문을 해석한 것은 2차세계대전의 기간을 2년정도 단축시켜 주기도 하였다. 20세기부터 70년대 이전에 암호학의 대부분은 정부의 안전범주에 속했지만, 공개표준키 체제의 탄생과 공개키 가밀법의 발명은 암호학을 대중영역에 접하게 하였다.
 
 
 
<ref> * 〈[https://cloud.google.com/kms/docs/encrypt-decrypt?hl=ko#kms-howto-encrypt-cli 대칭 키로 데이터 암호화 및 복호화]〉, 《구글 클라우드》, 2019-06-31 </ref>
 
  
 
==활용==
 
==활용==
 
 
'''암호화'''
 
'''암호화'''
 
데이터를 암호화하려면 적절한 키 정보를 제공하고, 암호화할 일반 텍스트 파일 이름을 지정하고, 암호화된 콘텐츠가 포함될 파일 이름을 지정한다.
 
데이터를 암호화하려면 적절한 키 정보를 제공하고, 암호화할 일반 텍스트 파일 이름을 지정하고, 암호화된 콘텐츠가 포함될 파일 이름을 지정한다.
  
gcloud kms encrypt \
+
gcloud kms encrypt \
location=[LOCATION]  \
+
location=[LOCATION]  \
keyring=[KEY_RING] \
+
keyring=[KEY_RING] \
key=[KEY] \
+
key=[KEY] \
plaintext-file=[FILEPATH_AND_FILENAME_TO_ENCRYPT] \
+
plaintext-file=[FILEPATH_AND_FILENAME_TO_ENCRYPT] \
ciphertext-file=[FILEPATH_AND_FILENAME].enc
+
ciphertext-file=[FILEPATH_AND_FILENAME].enc
 +
 
 
예를 들어 text.txt가 암호화할 일반 텍스트 파일 이름인 경우 다음 명령어를 실행한다
 
예를 들어 text.txt가 암호화할 일반 텍스트 파일 이름인 경우 다음 명령어를 실행한다
  
gcloud kms encrypt \
+
gcloud kms encrypt \
location global \
+
location global \
  
 +
keyring my_keyring \
 +
key my_key \
 +
plaintext-file text.txt \
 +
ciphertext-file text.enc
  
keyring my_keyring \
 
key my_key \
 
plaintext-file text.txt \
 
ciphertext-file text.enc
 
 
일반 텍스트 파일은 64KiB보다 작아야 한다.
 
일반 텍스트 파일은 64KiB보다 작아야 한다.
  
75번째 줄: 59번째 줄:
 
다음 encrypt 예는 버전 키 및 추가 인증 데이터를 지정하는 방법을 보여준다.
 
다음 encrypt 예는 버전 키 및 추가 인증 데이터를 지정하는 방법을 보여준다.
  
gcloud kms encrypt \
+
gcloud kms encrypt \
location=[LOCATION]  \
+
location=[LOCATION]  \
keyring=[KEY_RING] \
+
keyring=[KEY_RING] \
key=[KEY] \
+
key=[KEY] \
version=[KEY_VERSION] \
+
version=[KEY_VERSION] \
additional-authenticated-data-file=[ADDITIONAL_AUTHENTICATED_DATA_FILEPATH_AND_FILENAME] \
+
additional-authenticated-data-file=[ADDITIONAL_AUTHENTICATED_DATA_FILEPATH_AND_FILENAME] \
plaintext-file=[FILEPATH_AND_FILENAME_TO_ENCRYPT] \
+
plaintext-file=[FILEPATH_AND_FILENAME_TO_ENCRYPT] \
ciphertext-file=[FILEPATH_AND_FILENAME].enc
+
ciphertext-file=[FILEPATH_AND_FILENAME].enc
  
 +
'''복호화'''
  
 +
데이터를 복호화하려면 적절한 키 정보를 제공하고, 복호화할 암호화된 파일(암호문 파일) 이름을 지정하고, 복호화된 콘텐츠가 포함될 파일 이름을 지정한다.
  
'''복호화'''
+
gcloud kms decrypt \
 +
location=[LOCATION] \
 +
keyring=[KEY_RING] \
 +
key=[KEY] \
 +
ciphertext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT] \
 +
plaintext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT].dec
  
데이터를 복호화하려면 적절한 키 정보를 제공하고, 복호화할 암호화된 파일(암호문 파일) 이름을 지정하고, 복호화된 콘텐츠가 포함될 파일 이름을 지정한다.
 
gcloud kms decrypt \
 
location=[LOCATION] \
 
keyring=[KEY_RING] \
 
key=[KEY] \
 
ciphertext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT] \
 
plaintext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT].dec
 
 
예를 들어 text.enc가 복호화할 암호화된 파일 이름인 경우 다음 명령어를 실행한다.
 
예를 들어 text.enc가 복호화할 암호화된 파일 이름인 경우 다음 명령어를 실행한다.
gcloud kms decrypt \
+
 
location=global \
+
gcloud kms decrypt \
keyring=my_keyring \
+
location=global \
key=my_key \
+
keyring=my_keyring \
ciphertext-file=text.enc \
+
key=my_key \
plaintext-file=text.dec
+
ciphertext-file=text.enc \
 +
plaintext-file=text.dec
 +
 
 
decrypt 명령어는 추가 인증 데이터가 있는 파일을 지정하는 선택적 --additional-authenticated-data- file 플래그를 지원합니다. 추가 인증 데이터 파일은 64KiB보다 커서는 안 된다.
 
decrypt 명령어는 추가 인증 데이터가 있는 파일을 지정하는 선택적 --additional-authenticated-data- file 플래그를 지원합니다. 추가 인증 데이터 파일은 64KiB보다 커서는 안 된다.
경고: 파일을 암호화할 때 추가 인증 데이터를 사용한 경우, 암호문 복호화 시 같은 추가 인증 데이터를 지정해야 한다.
+
* 경고: 파일을 암호화할 때 추가 인증 데이터를 사용한 경우, 암호문 복호화 시 같은 추가 인증 데이터를 지정해야 한다.
 
--ciphertext-file 또는 --additional-authenticated-data-file이 -로 설정된 경우에는 해당 파일을 stdin에서 읽고 마찬가지로 --plaintext-file이 -로 설정된 경우에는 복호화된 일반 텍스트가 stdout에 기록이 된다.
 
--ciphertext-file 또는 --additional-authenticated-data-file이 -로 설정된 경우에는 해당 파일을 stdin에서 읽고 마찬가지로 --plaintext-file이 -로 설정된 경우에는 복호화된 일반 텍스트가 stdout에 기록이 된다.
다음 decrypt 예에서는 추가 인증 데이터를 지정하는 방법을 보여준다.
+
 
gcloud kms decrypt \
+
다음 decrypt 예에서는 추가 인증 데이터를 지정하는 방법을 보여준다.<ref>〈[https://cloud.google.com/kms/docs/encrypt-decrypt?hl=ko#kms-howto-encrypt-cli 대칭 키로 데이터 암호화 및 복호화]〉, 《구글 클라우드》, 2019-06-31</ref>
location=[LOCATION] \
+
 
keyring=[KEY_RING] \
+
gcloud kms decrypt \
key=[KEY] \
+
location=[LOCATION] \
additional-authenticated-data-file=[ADDITIONAL_AUTHENTICATED_DATA_FILEPATH_AND_FILENAME] \
+
keyring=[KEY_RING] \
ciphertext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT] \
+
key=[KEY] \
plaintext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT].dec
+
additional-authenticated-data-file=[ADDITIONAL_AUTHENTICATED_DATA_FILEPATH_AND_FILENAME] \
<ref> * 〈[https://cloud.google.com/kms/docs/encrypt-decrypt?hl=ko#kms-howto-encrypt-cli 대칭 키로 데이터 암호화 및 복호화]〉, 《구글 클라우드》, 2019-06-31 </ref>
+
ciphertext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT] \
 +
plaintext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT].dec
  
 
==사례==
 
==사례==
 
'''AWS KMS를 이용한 암호화 API 구축하기'''
 
'''AWS KMS를 이용한 암호화 API 구축하기'''
KMS Master Key 생성
+
* KMS Master Key 생성
AWS관리 콘솔에 로그인하고 IAM을 선택하고 진행한다.IAM 화면 좌측 메뉴 하단에 “Encryption Keys”를 클릭한 뒤 서울 Region을 먼저 선택하고 “Create Key”를 눌러 생성하면 된다. 시스템 관리자 권한으로 접근하여 생성할 수 있다.
+
* AWS관리 콘솔에 로그인하고 IAM을 선택하고 진행한다.IAM 화면 좌측 메뉴 하단에 “Encryption Keys”를 클릭한 뒤 서울 Region을 먼저 선택하고 “Create Key”를 눌러 생성하면 된다. 시스템 관리자 권한으로 접근하여 생성할 수 있다.
'''Create KMS Marter Key 암복호화 Lambda 함수 만들기'''
+
 
Lambda 함수는 Python, NodeJs, Java가 지원된다.(2016년 6월 시점).
+
'''Create KMS Marter Key 암복호화 Lambda 함수 만들기
Lambda 서비스를 선택한 뒤 “Create a Lambda function” 버튼을 클릭, 다음 화면에서 좌측 메뉴 “Configure function”을 선택하면 Lambda 함수를 설정할 수 있는 화면이 나타난다.( Lambda Configure function)
+
* Lambda 함수는 Python, NodeJs, Java가 지원된다.(2016년 6월 시점).
 +
* Lambda 서비스를 선택한 뒤 “Create a Lambda function” 버튼을 클릭, 다음 화면에서 좌측 메뉴 “Configure function”을 선택하면 Lambda 함수를 설정할 수 있는 화면이 나타난다.( Lambda Configure function)
  
 
본격적으로 함수 구현 스타트로
 
본격적으로 함수 구현 스타트로
  
 
라이브러리와 변수 초기화
 
라이브러리와 변수 초기화
import base64
+
import base64
import boto3
+
import boto3
from Crypto.Cipher import AES
+
from Crypto.Cipher import AES
self.client = boto3.client('kms')
+
self.client = boto3.client('kms')
 +
 
 
Boto3는 AWS에서 제공하는 Python용 SDK로 Low-level에 직접 접근할 수 있을 뿐 아니라 사용하기 쉬운 객체 지향 API를 제공한다.
 
Boto3는 AWS에서 제공하는 Python용 SDK로 Low-level에 직접 접근할 수 있을 뿐 아니라 사용하기 쉬운 객체 지향 API를 제공한다.
 +
 
Key Id 발급 및 Data Key 생성
 
Key Id 발급 및 Data Key 생성
self.key_id = 'arn:aws:kms:ap-northeast-2:123456789012:key/{Master Key}'
+
 
self.pad = lambda s: s + (32 - len(s) % 32) * ' '
+
self.key_id = 'arn:aws:kms:ap-northeast-2:123456789012:key/{Master Key}'
 +
self.pad = lambda s: s + (32 - len(s) % 32) * ' '
  
 
# data key 생성
 
# data key 생성
data_key = client.generate_data_key(KeyId=self.key_id, KeySpec='AES_256')
+
data_key = client.generate_data_key(KeyId=self.key_id, KeySpec='AES_256')
self.plaintext_key = data_key.get('Plaintext')
+
self.plaintext_key = data_key.get('Plaintext')
self.ciphertext_blob = data_key.get('CiphertextBlob')
+
self.ciphertext_blob = data_key.get('CiphertextBlob')
Master Key를 이용하여 Lambda class 로드 시, 암복호화에 필요한 Data Key(plaintext_key, ciphertext_blob)를 초기화합니다.
+
 
 +
Master Key를 이용하여 Lambda class 로드 시, 암복호화에 필요한 Data Key(plaintext_key, ciphertext_blob)를 초기화한다.
  
 
암호화 메소드
 
암호화 메소드
def encrypt_data(self, plaintext_message):
 
crypter = AES.new(self.plaintext_key)
 
encrypted_data = base64.b64encode(crypter.encrypt(self.pad(plaintext_message)))
 
  
return encrypted_data, self.ciphertext_blob
+
def encrypt_data(self, plaintext_message):
 +
crypter = AES.new(self.plaintext_key)
 +
encrypted_data = base64.b64encode(crypter.encrypt(self.pad(plaintext_message)))
 +
return encrypted_data, self.ciphertext_blob
 +
 
 
평문 Data Key를 이용하여 암호화 객체를 생성, 문자열을 암호화하고 base64로 인코딩 후 이미 생성된 암호화된 Data Key(ciphertext_blob)와 함께 반환한다. 이때 반환되는 암호화된 Data Key는 복호화에 필요한 평문 Data Key를 얻기 위해 꼭 필요한 정보이므로 어플리케이션에서 관리되어야 한다.
 
평문 Data Key를 이용하여 암호화 객체를 생성, 문자열을 암호화하고 base64로 인코딩 후 이미 생성된 암호화된 Data Key(ciphertext_blob)와 함께 반환한다. 이때 반환되는 암호화된 Data Key는 복호화에 필요한 평문 Data Key를 얻기 위해 꼭 필요한 정보이므로 어플리케이션에서 관리되어야 한다.
  
 
복호화 메소드
 
복호화 메소드
def decrypt_data(self, encrypted_data, ciphertext_blob):
 
decrypted_key = self.client.decrypt(ciphertext_blob).get('Plaintext')
 
crypter = AES.new(decrypted_key)
 
  
return crypter.decrypt(base64.b64decode(encrypted_data)).rstrip()
+
def decrypt_data(self, encrypted_data, ciphertext_blob):
 +
decrypted_key = self.client.decrypt(ciphertext_blob).get('Plaintext')
 +
crypter = AES.new(decrypted_key)
 +
return crypter.decrypt(base64.b64decode(encrypted_data)).rstrip()
 +
 
 
전달 받은 암호화된 문자열(encrypted_data)과 Data Key(ciphertext_blob)로 평문 Data Key를 반환 받아 암호화 역순으로 암호화된 문자열을 base64로 디코딩한 뒤 복호화해서 반환한다.
 
전달 받은 암호화된 문자열(encrypted_data)과 Data Key(ciphertext_blob)로 평문 Data Key를 반환 받아 암호화 역순으로 암호화된 문자열을 base64로 디코딩한 뒤 복호화해서 반환한다.
  
lambda_handler 구현
+
lambda_handler 구현
def lambda_handler(req_type, context):
+
def lambda_handler(req_type, context):
try:
+
try:
# TODO implement
+
# TODO implement
except Exception as e:
+
except Exception as e:
어플리케이션에서 요청(req_type)한 유형에 따라 위 구현 메소드를 수행할 처리 로직 및 예외상황에 대해 구현한다.
 
  
<ref> * 양은식,〈[http://woowabros.github.io/experience/2017/02/06/aws-kms.html AWS KMS를 이용한 암호화 API 구축하기]〉, 《우아한 형제들》, 2017-06-10 </ref>
+
어플리케이션에서 요청(req_type)한 유형에 따라 위 구현 메소드를 수행할 처리 로직 및 예외상황에 대해 구현한다.<ref>양은식, 〈[http://woowabros.github.io/experience/2017/02/06/aws-kms.html AWS KMS를 이용한 암호화 API 구축하기]〉, 《우아한 형제들》, 2017-06-10</ref>
  
 
{{각주}}
 
{{각주}}
174번째 줄: 167번째 줄:
 
* 〈[https://cloud.google.com/kms/docs/encrypt-decrypt?hl=ko#kms-howto-encrypt-cli 대칭 키로 데이터 암호화 및 복호화]〉, 《구글 클라우드》, 2019-06-31
 
* 〈[https://cloud.google.com/kms/docs/encrypt-decrypt?hl=ko#kms-howto-encrypt-cli 대칭 키로 데이터 암호화 및 복호화]〉, 《구글 클라우드》, 2019-06-31
 
* 양은식,〈[http://woowabros.github.io/experience/2017/02/06/aws-kms.html AWS KMS를 이용한 암호화 API 구축하기]〉, 《우아한 형제들》, 2017-06-10
 
* 양은식,〈[http://woowabros.github.io/experience/2017/02/06/aws-kms.html AWS KMS를 이용한 암호화 API 구축하기]〉, 《우아한 형제들》, 2017-06-10
==같이보기==
+
 
 +
==같이 보기==
 
* [[암호화]]
 
* [[암호화]]
 
* [[대칭키 암호]]
 
* [[대칭키 암호]]
183번째 줄: 177번째 줄:
 
* [[디코딩]]
 
* [[디코딩]]
  
{{암호 알고리즘|토막글}}
+
{{암호 알고리즘|검토 필요}}

2023년 1월 17일 (화) 14:22 기준 최신판

복호화(decryption) 또는 디코딩(decoding)은 부호화(encoding)된 정보를 부호(code)화되기 전으로 되돌리는 처리 혹은 그 처리 방식을 말한다. 역암호화라고도 한다. 보통은 부호화의 절차를 역으로 수행하면 복호화가 된다. 암호화(encryption)의 반대말로서의 복호화는 decryption이라고 부른다. 영어로는 decoding과 decryption이 구분되지만 한국어로는 구분이 되지 않는다. 한편 복호기 또는 디코더(decoder)는 복호화를 수행하는 장치나 회로, 컴퓨터 소프트웨어, 알고리즘 또는 사람을 말한다.[1]

개요[편집]

복호화(decryption)는 암호화데이터를 암호화되기 전의 형태로 바꾸는 처리를 말한다. 복호화는 암호화(encryption, 인크립션)의 반대말로서 영어로 decryption(디크립션)이라고 부른다. 복호화는 디코딩(decoding)과 유사하다.

암호화에 사용된 키와 쌍을 이루는 또 다른 유일한 키를 사용하여야만 복호화가 가능하다. 복호화에 암호화와 동일한 키를 사용하는 것을 대칭키 암호(symmetric-key algorithm)라고 하며, 복호화와 암호화에 다른 키를 사용하는 것을 공개키 암호(public-key cryptography) 혹은 비대칭키 암호라고 한다.

대칭키 암호는 신속한 복호화와 암호화를 할 수 있지만, 다른 사람에게 암복호화에 쓰이는 키를 안전하게 전달할 구체적인 방법이 없다. 반면에 공개키 암호는 다른 사람에게 암호화에 필요한 키를 안전하게 전달하는 것이 가능하지만 암복화를 하는데 오랜 시간이 필요하다. 대표적인 대칭키 암호는 AES이고, 공개키 암호는 RSA이다.

종류[편집]

부호화의 역과정 (Decoding, 복호화) 디지털 변조 및 복조 방식에서

  • 복조(Demodulation) : 원래 파형의 복구(복제)한다.
  • 복호(Decoding/Detection/Decision) : 유효 부호어 또는 디지털 심볼의 결정한다.

디지털 변조 파형의 복조 후에 심볼의 결정(판단) 과정이다.

전송 채널 오류에 대처하는 기법에 대해서는,효율적 복호(디코딩)의 어렵다. 부호화(코딩)은 비교적 자연스럽게/일원적으로 제시되지만,

  • 오류 섞인 수신 신호로부터 효율적으로 디코딩하는 것은 매우 어려운 과제이다.
  • 특정 채널부호화 방식에서도 여러 디코딩 방식들이 제안되었다.
  • A/D 변환의 역과정 (D/A Conversion, D/A 변환)

- 상대 전송장치에서 전송되어온 디지털 신호를 아날로그 신호로 변환하는 것이다.

  • 암호화의 역과정 (Decryption, 암호해독) : 역암호화이다.[2]

역사[편집]

암호학의 기원은 수천년 전부터 이뤄, 최근 수십 년까지의 기간을 일컫는다. 역사상 기록으로 남은 가장 오래된 암호는 율리우스 카이사르가 사용한 대입암호이다. 고대 그리스에서 사용되던 스키테일 암호체계도 있다. 이 시기의 암호화 기법을 고전 암호학이라 부르는데, 고전 암호학의 암호학 기법은 대체로 큰 차이가 없었다. 이런 고전 암호화 기법은 20세기 초에 이뤄서야 변화가 생겼는데, 이의 예로는 에니그마(독일어:Enigma 뜻:수수께기)가 사용한 회전륜 가밀법이 대표적이다. 이후 전자요소와 계산기(컴퓨터)는 큰 발전을 이뤘으며, 이때 사용된 암호화 기법은 전통적인 사서통신에 쓰일 수 없게 되었다. 암호학의 발전은 암호분석학과 함께 발전했다. 즉 암호 편집과 가밀법에 대한 해독법을 말한다. 주로 가밀된 신호의 빈율을 분석하여 해석했는데, 이런 방법을 응용하여 해석된 암호문은 때때로 역사를 바꾸기도 했다. 예를 들어, 치머만 전보를 해석한 것은 미국이 1차 세계대전에 참전하게 되는 계기가 되었고, 동맹국이 나치의 암호문을 해석한 것은 2차 세계대전의 기간을 2년 정도 단축시켜 주기도 하였다. 20세기부터 70년대 이전에 암호학의 대부분은 정부의 안전범주에 속했지만, 공개표준키 체제의 탄생과 공개키 가밀법의 발명은 암호학을 대중영역에 접하게 하였다.[3]

활용[편집]

암호화 데이터를 암호화하려면 적절한 키 정보를 제공하고, 암호화할 일반 텍스트 파일 이름을 지정하고, 암호화된 콘텐츠가 포함될 파일 이름을 지정한다.

gcloud kms encrypt \
location=[LOCATION]  \
keyring=[KEY_RING] \
key=[KEY] \
plaintext-file=[FILEPATH_AND_FILENAME_TO_ENCRYPT] \
ciphertext-file=[FILEPATH_AND_FILENAME].enc

예를 들어 text.txt가 암호화할 일반 텍스트 파일 이름인 경우 다음 명령어를 실행한다

gcloud kms encrypt \
location global \
keyring my_keyring \
key my_key \
plaintext-file text.txt \
ciphertext-file text.enc

일반 텍스트 파일은 64KiB보다 작아야 한다.

encrypt 명령어는 추가 인증 데이터가 있는 파일을 지정하는 선택적 --additional-authenticated-data- file 플래그를 지원합니다. 추가 인증 데이터 파일은 64KiB보다 커서는 안 된다. 경고: 파일을 암호화할 때 추가 인증 데이터를 사용하는 경우, 암호문 복호화 시 같은 추가 인증 데이터를 지정해야 한다. --plaintext-file 또는 --additional-authenticated-data-file이 -로 설정된 경우에는 해당 파일을 stdin에서 읽습니다. 마찬가지로 --ciphertext-file이 -로 설정된 경우에는 암호문이 stdout에 작성된다.

encrypt 명령어는 암호화에 사용할 키의 버전을 나타내는 선택적 --version 플래그를 지원합니다. 기본적으로 기본 버전이 사용된다.

다음 encrypt 예는 버전 키 및 추가 인증 데이터를 지정하는 방법을 보여준다.

gcloud kms encrypt \
location=[LOCATION]  \
keyring=[KEY_RING] \
key=[KEY] \
version=[KEY_VERSION] \
additional-authenticated-data-file=[ADDITIONAL_AUTHENTICATED_DATA_FILEPATH_AND_FILENAME] \
plaintext-file=[FILEPATH_AND_FILENAME_TO_ENCRYPT] \
ciphertext-file=[FILEPATH_AND_FILENAME].enc

복호화

데이터를 복호화하려면 적절한 키 정보를 제공하고, 복호화할 암호화된 파일(암호문 파일) 이름을 지정하고, 복호화된 콘텐츠가 포함될 파일 이름을 지정한다.

gcloud kms decrypt \
location=[LOCATION] \
keyring=[KEY_RING] \
key=[KEY] \
ciphertext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT] \
plaintext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT].dec

예를 들어 text.enc가 복호화할 암호화된 파일 이름인 경우 다음 명령어를 실행한다.

gcloud kms decrypt \
location=global \
keyring=my_keyring \
key=my_key \
ciphertext-file=text.enc \
plaintext-file=text.dec

decrypt 명령어는 추가 인증 데이터가 있는 파일을 지정하는 선택적 --additional-authenticated-data- file 플래그를 지원합니다. 추가 인증 데이터 파일은 64KiB보다 커서는 안 된다.

  • 경고: 파일을 암호화할 때 추가 인증 데이터를 사용한 경우, 암호문 복호화 시 같은 추가 인증 데이터를 지정해야 한다.

--ciphertext-file 또는 --additional-authenticated-data-file이 -로 설정된 경우에는 해당 파일을 stdin에서 읽고 마찬가지로 --plaintext-file이 -로 설정된 경우에는 복호화된 일반 텍스트가 stdout에 기록이 된다.

다음 decrypt 예에서는 추가 인증 데이터를 지정하는 방법을 보여준다.[4]

gcloud kms decrypt \
location=[LOCATION] \
keyring=[KEY_RING] \
key=[KEY] \
additional-authenticated-data-file=[ADDITIONAL_AUTHENTICATED_DATA_FILEPATH_AND_FILENAME] \
ciphertext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT] \
plaintext-file=[FILEPATH_AND_FILENAME_TO_DECRYPT].dec

사례[편집]

AWS KMS를 이용한 암호화 API 구축하기

  • KMS Master Key 생성
  • AWS관리 콘솔에 로그인하고 IAM을 선택하고 진행한다.IAM 화면 좌측 메뉴 하단에 “Encryption Keys”를 클릭한 뒤 서울 Region을 먼저 선택하고 “Create Key”를 눌러 생성하면 된다. 시스템 관리자 권한으로 접근하여 생성할 수 있다.

Create KMS Marter Key 암복호화 Lambda 함수 만들기

  • Lambda 함수는 Python, NodeJs, Java가 지원된다.(2016년 6월 시점).
  • Lambda 서비스를 선택한 뒤 “Create a Lambda function” 버튼을 클릭, 다음 화면에서 좌측 메뉴 “Configure function”을 선택하면 Lambda 함수를 설정할 수 있는 화면이 나타난다.( Lambda Configure function)

본격적으로 함수 구현 스타트로

라이브러리와 변수 초기화

import base64
import boto3
from Crypto.Cipher import AES
self.client = boto3.client('kms')

Boto3는 AWS에서 제공하는 Python용 SDK로 Low-level에 직접 접근할 수 있을 뿐 아니라 사용하기 쉬운 객체 지향 API를 제공한다.

Key Id 발급 및 Data Key 생성

self.key_id = 'arn:aws:kms:ap-northeast-2:123456789012:key/{Master Key}'
self.pad = lambda s: s + (32 - len(s) % 32) * ' '
  1. data key 생성
data_key = client.generate_data_key(KeyId=self.key_id, KeySpec='AES_256')
self.plaintext_key = data_key.get('Plaintext')
self.ciphertext_blob = data_key.get('CiphertextBlob')

Master Key를 이용하여 Lambda class 로드 시, 암복호화에 필요한 Data Key(plaintext_key, ciphertext_blob)를 초기화한다.

암호화 메소드

def encrypt_data(self, plaintext_message):
crypter = AES.new(self.plaintext_key)
encrypted_data = base64.b64encode(crypter.encrypt(self.pad(plaintext_message)))
return encrypted_data, self.ciphertext_blob

평문 Data Key를 이용하여 암호화 객체를 생성, 문자열을 암호화하고 base64로 인코딩 후 이미 생성된 암호화된 Data Key(ciphertext_blob)와 함께 반환한다. 이때 반환되는 암호화된 Data Key는 복호화에 필요한 평문 Data Key를 얻기 위해 꼭 필요한 정보이므로 어플리케이션에서 관리되어야 한다.

복호화 메소드

def decrypt_data(self, encrypted_data, ciphertext_blob):
decrypted_key = self.client.decrypt(ciphertext_blob).get('Plaintext')
crypter = AES.new(decrypted_key)
return crypter.decrypt(base64.b64decode(encrypted_data)).rstrip()

전달 받은 암호화된 문자열(encrypted_data)과 Data Key(ciphertext_blob)로 평문 Data Key를 반환 받아 암호화 역순으로 암호화된 문자열을 base64로 디코딩한 뒤 복호화해서 반환한다.

lambda_handler 구현
def lambda_handler(req_type, context):
try:
# TODO implement
except Exception as e:

어플리케이션에서 요청(req_type)한 유형에 따라 위 구현 메소드를 수행할 처리 로직 및 예외상황에 대해 구현한다.[5]

각주[편집]

  1. 복호화〉, 《위키백과》
  2. 복호화〉, 《나무위키》
  3. 대칭 키로 데이터 암호화 및 복호화〉, 《구글 클라우드》, 2019-06-31
  4. 대칭 키로 데이터 암호화 및 복호화〉, 《구글 클라우드》, 2019-06-31
  5. 양은식, 〈AWS KMS를 이용한 암호화 API 구축하기〉, 《우아한 형제들》, 2017-06-10

참고자료[편집]

같이 보기[편집]


  검수요청.png검수요청.png 이 복호화 문서는 암호 알고리즘에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.