Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

US0

CH.1 Openssl를 활용한 암호화 프로그래밍 <암호화 구조체> 본문

Security/Cryptography

CH.1 Openssl를 활용한 암호화 프로그래밍 <암호화 구조체>

us0 2018. 11. 5. 00:55

앞에서 3가지 비밀키 암호화 방법에 대해서 이야기 하였다. 

2018/11/05 - [Security/Cryptography] - CH.0 Openssl를 활용한 암호화 프로그래밍 <기초지식>




이번엔 2번째 방법이 였던 EVP API를 활용할수 있도록하는 구조체들을 알아보자


암호화 구조체(EVP)


EVP API를 사용한 비밀키 암호화 작업을 수행하기 위해 가장먼저 해야하는 것

암호화 구조체는 암호화를 수행하는 동안의 모든 정보들이 저장되는 곳!! (그니까 먼저 구조체를 초기화 해줘야 겠다!!!!)


비밀키 암호화 알고리즘에 따라 Key의 길이, 사용하는 Block의 길이가 다른데 암호화 구조체에는 이러한 각 알고리즘에 대한 정보들이 저장된다.

또한, 'IV(Initailized Vector)',   'Key'와 같은 비밀키 암호화에 사용 되는 중요한 값들이 저장 되기도 하고, 암호화 결과로 생성되는 중간 데이터들이 저장 되기도 함!!


(뜬금, 비밀키 == 대칭키인걸 잊지말자!!!!)



결국 구조체안에는

IV, Key, 중간데이터, 무슨암호화 사용하는지,  중간데이터 등 다양한 정보가 저장될수 있는 공간이다!!!! 라고 알아두고 들어가보자





EVP_CIPHER

'암호화 알고리즘 구조체' 라고 부르는 OpenSSL API의 구조체이다. 비밀키 암호화 알고리즘에 대한 정보를 저장한다.

이 구조체를 통해 EVP API의 여러 함수에 '이 비밀키 암호화 알고리즘을 사용해라!!' 라는것을 알려 줄 수 있다.

이 구조체는 두가지 방법으로 얻을수 있다. 


방법 1.

EVP_CIPHER 를 반환하는 함수를 사용하자!! 함수의 이름은 '알고리즘명 + 키 길이 + 블럭모드' 형식으로 되어있다.


방법 2.

EVP_get_cipherbyname 함수를 사용 하는데 이건 또 위와 다르게  '알고리즘명 + 키 길이 + 블럭모드' 형식의 문자열(String)을 넣어준다!!!!



//두 방법의 차이를 알아보자

EVP_CIPHER *c= EVP_des_cbc();         // 방법 1 사용

//des_cbc 사용

EVP_CIPHER *c= EVP_aes_128_cbc();     // 방법 1 사용

//aes_128_cbc 사용

EVP_CIPHER *c= EVP_get_cipherbyname ("aes_192_cbc"); // 방법 2 사용

//aes_128_cbc사용


/*

  *여기서 주의할점!? 보단 의문을 가질수 있다. 왜 EVP_des_cbc()는 키 길이가 안나와 있지? 라고도 할 수 있는데

  *des의 키 길이는 항상 64bit 로 고정이기 때문에 굳이 EVP_des_64_cbc() 이런식으로 안 만들어 준거 같다. 

 */



EVP_CIPHER_CTX


이 친구는 암호화 컨텍스트(Cipher Context) 라고 부른다.

 비밀키 알고리즘을 통한 암호화가 진행되면서 생성되는 데이터들을 저장하는 역할을 한다. (중간데이터 저장소라고 기억하면 될 듯)


ex)DES알고리즘은 각 블럭에 대해 16round를 거쳐 암호화 과정을 반복하는데 이런 과정 중간에 생성되는 

데이터들을 저장할 공간이 필요 하게되며 IV나 키를 저장할 공간이 필요할 것

EVP_CIPHER_CTX는 이러한 암호화, 복호화에 필요한 중간데이터들을 저장.



EVP_CIPHER_CTX 를 생성하는 방법!! >>포인터 변수를 만들고 init 시키자!! 

//방법 1

EVP_CIPHER_CTX *ctx;

EVP_CIPHER_CTX_init(ctx);


//방법 2

EVP_CIPHER_CTX *ctx=EVP_CIPHER_CTX_new();



/*2개 방법엔 딱히 차이가 없음!!!! 그냥 맘대롱 택 1*/


Tip~~~

EVP_CIPHER_CTX(암호화 컨텍스트)는 암호화시 생성되거나 필요한 데이터를 저장하는 공간이므로 다른 암호화 과정이라면 다른 암호화 컨텍스트를 만들어서 사용해야한다.

    if, 같은 암호화 컨텍스트를 다른 암호화 과정마다 공유해서 사용한다면 심각한 상황 일어남!! 

       근데 예를들면 DES 랑 AES랑 서로 다른거 알면서 같은 구조체를 이용한다면 바보?? 실수 조심!!!