US0
CH.2 Openssl를 활용한 암호화 프로그래밍 <비밀키 암호화 순서> 본문
EVP가 무엇인지 EVP_CIPHER 구조체가 무엇인지 모르거나 이해가 되지 않는다면 앞의 내용을 참고하자!!
2018/11/05 - [Security/Cryptography] - CH.0 Openssl를 활용한 암호화 프로그래밍 <기초지식>
2018/11/05 - [Security/Cryptography] - CH.1 Openssl를 활용한 암호화 프로그래밍 <암호화 구조체>
EVP API를 이용한 비밀키 암호화
- EVP API는 암호화 방법이나 암호화 알고리즘에 상관없이 공통된 프로그래밍 인터페이스를 제공!! 한다고 CH0에서 말했었다.
EVP API는 <3단계를 거쳐 암호화를 한다!!!> 즉, 3단계를 거쳐 암/복 호화 수행
EVP API의 3단계 과정!!!
초기화
|
|
업데이트
|
|
종료
각 함수 이름은 순서대로 EVP_EncryptInit_ex, EVP_EncryptUpdate, EVP_EncryptFinal_ex 이다.
비밀키 암호화 프로그래밍 과정을 살펴보자
1. 암호화 알고리즘과 Block mode, key length를 나타내는 EVP CHIPHER 구조체를 생성한다.
2. 암호화 과정 수행 중에 생성되는 정보를 저장할 EVP_CIPHER_CTX 컨텍스트를 생성한다.
3. 암호화 과정에서 사용할 키를 생성한다. //3, 4번 수행은 CH 1.에서 이미 설명한번 함!!!
4. 암호화 과정에서 초기화 벡터로 사용될 IV값을 생성한다.
5. EVP_EncryptInit_ex 함수를 사용해 초기화 과정을 수행한다.
6. EVP_EncrpytUpdate 함수를 사용해 업데이트 과정을 수행한다.
7. EVP_EncryptFinal_ex 함수를 사용해 종료 과정을 수행한다. //빨강이들 오늘 할거
초기화 과정
초기화과정은 이전 과정에서 만든 EVP_CIPHER, EVP_CIPHER_CTX, KEY, IV 를 OpenSSL API에 알려주는 과정이다.
(알려줘야 애네들이 아~ 무슨 암호화를 하고 어떻게 해야겠구나!! 이것을 앎!!)
EVP_EncryptInit_ex 함수를 사용하여 초기화하니 이함수를 살펴보자
int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
ENGINE *impl, const unsigned char *key, const unsigned char *iv);
뭐가 많은데 하나 씩 살펴보면
첫번째 매개변수인 EVP_CIPHER_CTX *ctx 이것은 진행과정 2번에서 만들었던 EVP_CIPHER_CTX의 구조체 포인터 변수를 넣어주면 된다.
두번째 매개변수인 const EVP_CIPHER *type 이것은 우리가 미리 만들어 주었던 EVP_CIPHER *c= EVP_des_cbc(); <<< 이랬던거 이런걸 넣어주면 된다.
-즉, 어떤 타입의 암호화를 진행할 것 인가를 명시 해주는것이라고 생각하면 됨!!!!
세번째는 ENGINE *impl 이 녀석인데 자료형이 ENGINE이다 이것은 하드웨어 암호화 엔진을 나타내는 구조체인데 하드웨어 엔진을 사용하지 않으면 NULL값을 넣는다. (아직 HW엔진이 무엇인지 잘 모름으로 pass!! ㅎ.ㅎ)
네 / 다섯번째 key와 iv는 앞에서(ch0, ch1) 계속 말했으니 건너뛰겠다!!
그리고 EVP_EncryptInit_ex 함수는 성공시 return 1; 실패시 return 0;
사실 이 함수는 EVP_CIPHER에 저장된 비밀키 암호화 알고리즘의 정보와 Key, IV 값을 EVP_CIPHER_CTX에 저장하는 역할을 한다.
p.s 저번에 말했지만 EVP_CIPHER_CTX구조체는 특별한 녀석이 아닌 암호화시 생성되거나 필요한 데이터를 저장하는 공간이다!!!
업데이트 과정
업데이트 과정은 실제로 암호화를 수행하는 과정!!
초기화과정에서 얻은 알고리즘 정보, Key, IV를 가지고 평문을 암호화 한다.
(그럼 평문은 언제 넣어주냐?!?!?!! 여기서 넣어주면 됨 ㅎㅎ
업데이트 과정에서 암호화를 한다고해서 이 업데이트 과정만으로 모든 평문 데이터가 암호화 되는 것은 아니다!!
모든 평문데이터가 암호화 과정을 마치는 경우는 종료 과정을 거친후에야 모든 입력 데이터의 암호화된 데이터를 얻을 수 있다.
tip. 이유가 궁금할 텐데 블럭 암호화에는 패딩이 들어가기 때문이다. 이런 패딩이란 애 때문에 종료과정이 한번 더 들어가는 것이다.
패딩을 없애면 되지 않느냐?? 라고 생각할 수 있는데 블럭암호특징은 input값이 항상 같아야하기 때문에 어쩔수없이 패딩이란 애는 필요!!
따라서 패딩이 필요하지 않는 경우 딱 블럭 길이로 나눠질경우 모든데이터는 이 업데이트 과정에서 암호화가 되긴한다.
그럼 이 과정에서 사용하는 함수는?? EVP_EncrpytUpdate 이 녀석이다.
이 함수의 정의를 살펴보자
int EVP_EncryptUpdate ( IN EVP_CIPHER_CTX *ctx, // 암호화 컨텍스트
OUT unsigned char *out. // 출력 암호문 저장할 공간 (시작점 이라고 보면됨!! . 인덱스 참조)
OUT int *outl, // 출력 암호문의 길이를 반환!! (이번에 암호화된)
IN unsigned char *in // 입력 평문 데이터
IN int inl); // 입력!! 암호화 시킬 평문 데이터의 길이
ps. IN과 OUT이라는 글씨가 있는데 이건 자료형이아닌 실제 입력받는것(Plane_TXT etc..) 과 암호화 되고 나가는 공간을 뜻함!!
종료 과정
종료 과정은 아주 단순하다. 그냥 업데이트 과정에서 마치지 못하고 남은 데이터를 암호화한다.(아까 말했듯이 패딩된 데이터라고 생각하면 되겠다.)
즉, 마지막 블록 암호화
그리고 한가지의 다른 목적은 안전을위해 종료 과정을 꼭!!!!!! 수행 해야한다 EVP_EncryptFinal_ex 사용!!
int EVP_EncryptFinal_ex( IN EVP_CIPHER_CTX *ctx, //암호화 컨텍스트
OUT unsigned char *out, //출력 한다 ---암호문 (암호문이 저장될 공간이 오면 되겠지??)
OUT int *outl); //출력 한다 ---- 암호문의 길이 (이번에 암호화된)
'Security > Cryptography' 카테고리의 다른 글
[OpenSSL] <openssl/evp.h>EVP 함수 정리 (0) | 2018.11.10 |
---|---|
CH.4 Openssl를 활용한 암호화 프로그래밍<EVP API를 활용한 DES_CBC 암.복호화 실습. OP2.> (0) | 2018.11.08 |
CH.3 Openssl를 활용한 암호화 프로그래밍<EVP API를 활용한 DES_CBC 암.복호화 실습 OP1.> (0) | 2018.11.08 |
CH.1 Openssl를 활용한 암호화 프로그래밍 <암호화 구조체> (0) | 2018.11.05 |
CH.0 Openssl를 활용한 암호화 프로그래밍 <기초지식> (1) | 2018.11.05 |