[C++] AES Encryption in C++

개요

암호화 알고리즘은 여러 가지가 있다.

그 중 암호화 깊이가 높아서 쉽게 풀리지 않는 알고리즘 중 AES 암호화를 소개하려 한다.

2001년, 미국 표준 기술 연구소(NIST)가고급 암호화 표준(Advanced Encryption Standard, AES) 이라는 이름으로 새로운 알고리즘을 공모 하였고, 이 때 Rijndael(레인달) 알고리즘이 채택되어 AES 암호화가 생겨 났다. (WIK)

 

AES는 DES와 마찬가지로 블록 암호화 방식이며, 다음과 같은 Mode를 지원한다.

  • ECB(electronic codebook)
  • CBC(cipher-block chaining)
  • CFB(cipher feedback)
  • OFB(output feedback)
  • CTR(counter)

 

ECB(electronic codebook, 전자북)

블록 암호화 방식 중 가장 단순한 구조를 가진다.

각각 독립적으로 암호화가 진행된다. => “PlainText” 가 잘못 전송 되어도, 다른 암호화 블록에 영향을 주지 않는다.

 

CBC(Cipher-Block Chaining, 암호 블록 체인 방식)

각 블록은 암호화되기 전에 이전 블록의 암호화 결과와 XOR 된다.

첫 블록의 경우에는 초기화 벡터가 사용된다.

 

CFB(Cipher Feedback, 암호 피드백)

CFB는 CBC의 변형적 구조다.

 

OFB(Output Feedback, 출력 피드백)

“Block Cipher Encryption” 을 다음 블록에 넘긴 후에 “PlainText”와 XOR하여 암호화 블록은 만든다. => “PlainText” 가 잘못 전송 되어도, 다른 암호화 블록에 영향을 주지 않는다.

 

CTR(Counter, 카운터)

CTR 방식은 블록 암호를 스트림 암호로 바꾸는 구조를 가진다.

CTR 방식은 각 블록의 암호화 및 복호화가 독립적이다. 병렬적으로 처리도 가능하다. 원하는 부분만 복호화도 가능하다.

 

Source Code (C++, openssl)

아래 코드는 “openssl”을 사용하여 AES를 구현한 코드이기 때문에, 사용 전에 “openssl”이 설치되어 있어야 한다.

 

#include <openssl/aes.h>
#define KEY_SIZE 16

string encryptedData = "..."; //TODO
unsigned char key[KEY_SIZE] = {...}; //TODO
unsigned char iv[KEY_SIZE] = {...}; //TODO

AES_KEY aes_key;
unsigned char ctext[encryptedData.size()/2] = {0,};
unsigned char rtext[encryptedData.size()/2+1] = {0,};

AES_set_encrypt_key(key, KEY_SIZE, &aes_key);
AES_cbc_encrypt(ctext, rtext, encryptedData.size()/2, &aes_key, iv, AES_ENCRYPT);


cout << rtext << endl;

 


ref.