2017년 6월 18일 일요일

AES with openssl


앞에서 aes를 https://github.com/kokke/tiny-AES128-C 여기 소스를 이용해서 만들었습니다. http://swlock.blogspot.com/2017/06/aes-128-example-cbc-mode-with-hash-hmac.html

openssl에도 AES가 구현되어 있습니다. 그래서 소스를 검토해보았습니다.

위치는 아래와 같고,
https://github.com/openssl/openssl/tree/master/crypto/aes

핵심 소스는 core에 있습니다.
https://github.com/openssl/openssl/blob/master/crypto/aes/aes_core.c

그래서 openssl을 함께 빌드할때 예제를 찾아보았습니다.
http://www.firmcodes.com/how-do-aes-128-bit-cbc-mode-encryption-c-programming-code-openssl/

소스를 간단하게 정리해 보자면 아래와 같습니다.

AES 128은 128/8=16byte 키를 가집니다.
/* AES key for Encryption and Decryption */
const static unsigned char aes_key[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF};

/* Init vector */ <=CBC 모드에서 사용하는 초기값을 의미합니다.
unsigned char iv[AES_BLOCK_SIZE];
memset(iv, 0x00, AES_BLOCK_SIZE);

AES_KEY enc_key, dec_key; <= 키를 의미합니다.
AES_set_encrypt_key(aes_key, sizeof(aes_key)*8, &enc_key); <=키를 세팅하고
AES_cbc_encrypt(aes_input, enc_out, sizeof(aes_input), &enc_key, iv, AES_ENCRYPT); <= 암호화를 합니다.

/* AES-128 bit CBC Decryption */
memset(iv, 0x00, AES_BLOCK_SIZE); // don't forget to set iv vector again, else you can't decrypt data properly
<= 벡터를 초기값을 넣습니다. 초기 벡터는 입력과 출력을 같은 값으로 넣어야 합니다.
AES_set_decrypt_key(aes_key, sizeof(aes_key)*8, &dec_key); // Size of key is in bits
AES_cbc_encrypt(enc_out, dec_out, sizeof(aes_input), &dec_key, iv, AES_DECRYPT);

이전에 작업했던 부분과 연결하면되는데, 제가 가진 환경이 pc환경이고 openssl을 사용해 빌드할만한 환경이 아니라서 추가 예제를 작성하지 못하고 여기에서 마무리 하도록하겠습니다.




댓글 없음:

댓글 쓰기