Simongs NOTE

[ETC] Encrypt & Decrypt

2016-11-10
ETC

대칭키 vs 비대칭키 암호화

기초 용어

  • 어문을 복호화 할 수 있다면 양방향, 암호화만 가능하다면 단방향
  • 암호화 vs 복호화
  • 암호화를 하려면 key 가 존재한다.

key 종류에 따른 암호화 종류

대칭키 암호화

  • 서로 동일한 키로 암호화, 복호화 진행
  • 공통키 암호화라고도 한다.
  • 그래서 비밀키 암호화로도 불리운다.
  • 속도가 빠르다. (알고리즘이 복잡하지 않으므로)
  • (단점) 그대신 키 하나가 털리면 끝~

대칭키 암호화 2가지 종류

스트림 암호 (축차암호)
  • 1bit나 1byte 단위로 차례로 암호화되는 방식
  • RC4, SEAL 등의 암호방식이 있다.
블록 암호
  • 평문과 암호문의 데이터를 일정한 길이(블럭) 마다 구획하해 암호화하고 복호화하는 방식
  • 보통 64비트 혹은 128 비트 단위로 블럭화한다.
  • 평문 (64비트) - 키(key) - 암호문
  • DES - BLOCK(64bit) - KEY (64bit) (이미 깨짐)
  • AES - BLOCK(128bit) - KEY (128, 192, 256bit) - 레인달 알고리즘 (2000)
  • 각 블럭을 독립적으로 암호화하는 방식은 ECB(electric code block)
  • 이전 블럭의 암호화된 데이터와 새로운 평문 block의 XOR 값을 연산해서 두번째 Block을 만들어내는 연쇄식 블럭암호가 CBC (Cipher Block Chaining) 방식이있다.
종류 키의 길이 블록길이 단수
AES-128 128 128 10
AES-192 192 128 12
AES-256 256 128 14

비대칭키 암호화

  • 공개키 암호화라고 불리운다.
  • 암호화키, 복호화키 가 서로 다르다.
  • 즉 사용자는 2개의 키를 가지고 있어야 한다.
  • 2개의 키는 비밀키(secret key), 공개키(public key) 이다.
  • 누군가 사용자에게 암호화 값을 전달하고 싶다면 사용자의 공개키로 암호화를 해서 사용자에게 던진다.
  • 사용자는 해당 값을 본인이 가지고 있는 비밀키로 복호화 해서 해석한다.

TLS (Transport Layer Security)

  • SSL 1.0, 2.0, 3.0 -> TLS 1.0, 1.1, 1.2, 1.3
  • TLS가 표준명칭이지만 태생으로 인해 SSL 이라고 많이 부른다.

TLS 프로토콜

TLS 핸드쉐이크

  • 클라이언트는 서버에 접속하여 “client Hello” 라는 데이터를 전송한다. 이때 추가적인 정보로 클라이언트가 사용 가능한 암호화 방법의 목록인 Cipher Suite를 전달한다.
  • 서버는 클라이언트로부터 받은 Cipher Suite 목록을 서버가 지원하는 Cipher Suite 리스트와 비교한다. 우선순위에 따라 가장 먼저 선택되는 Cipher suite 를 돌려준다. 이때 전송되는 데이터는 서버의 인증서와 대칭키 암호화를 위한 난수를 포함한다.
  • 서버는 클라이언트에게 “Server Hello”가 종료되었음을 알린다.
  • 클라이언트는 서버의 난수와 클라이언트의 난수를 조합해서 대칭키 암호화에 사용할 비밀키를 생성한다. 생성한 비밀키를 서버의 공개키로 암호화하여 서버로 돌려준다.
  • 클라이언트는 서버로 종료 신호를 보낸다.
  • 서버는 클라이언트의 종료신호를 받고 서버의 종료신호를 보냄으로써 핸드쉐이크 프로토콜을 마무리한다.

openssl 개인키 생성

  • RSA 비밀키 생성
  • 비밀키 파일의 내용을 보호하기 위한 AES 암호키 (입력하는 password 값)
~) openssl genrsa -aes256 -out privatekey.pem 2048
Generating RSA private key, 2048 bit long modulus
.......+++
..............................................................................+++
e is 65537 (0x10001)
Enter pass phrase for privatekey.pem:
Verifying - Enter pass phrase for privatekey.pem:
 simons@simonsui-MacBook-Pro  ~/workspace/workspace-etc/openssl 

공개키 생성

  • 인증서 서명 요청을 위한 CSR 파일 생성시에 자동으로 공개키가 포함된다.
  • CSR은 Certification Signing Request의 약자이다.
  • CSR 파일은 파일을 생성한 기관의 공개키와 웹 서비스를 제공하는 회사의 정보를 암호화한 정보가 담겨 있다.
  • 원래는 CSR 파일을 상위 인증기관으로 보내서 그들의 비밀키로 전자서명을 받으면 인증서가 완료된다.
~)  openssl req -new -key privatekey.pem -out netty.csr
Enter pass phrase for privatekey.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:KR
State or Province Name (full name) [Some-State]:SEOUL
Locality Name (eg, city) []:SEOUL
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Dasolute
Organizational Unit Name (eg, section) []:Development
Common Name (e.g. server FQDN or YOUR name) []:netty.dasolute.com
Email Address []:chopokmado@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

전자서명으로 인증서 만들기 및 결과

  • 로컬에서는 위에서 만든 비밀키로 CSR에 전자서명을 하는데 이를 자체서명 인증서라고 한다.
~) openssl x509 -in netty.csr -out netty.crt -req -signkey privatekey.pem -days 356
Signature ok
subject=/C=KR/ST=SEOUL/L=SEOUL/O=Dasolute/OU=Development/CN=netty.dasolute.com/emailAddress=chopokmado@gmail.com
Getting Private key
Enter pass phrase for privatekey.pem:
~) ll
total 24
drwxr-xr-x  5 simons  staff   170 11  9 20:47 .
drwxr-xr-x  7 simons  staff   238 11  9 20:33 ..
-rw-r--r--  1 simons  staff  1338 11  9 20:47 netty.crt
-rw-r--r--  1 simons  staff  1070 11  9 20:42 netty.csr
-rw-r--r--  1 simons  staff  1766 11  9 20:34 privatekey.pem

AES 알고리즘

대표적인 대칭키 알고리즘

  • IV : Initial Vector
  • mode of operation : 운영모드

IV 값은 운영모드가 결정한다. 예를 들어 CBC 같은 경우는 IV 값의 크기가 Block 크기과 같다.

AES-128, AES-256 은 KEY의 bit수를 나타낸다. 즉 128은 16바이트, 256은 32바이트를 의미한다. Key의 바이트가 커진다고 IV 값이 무조건 커지지 않는다.


Comments

Content