해당 글은 OpenSSL 3.14 버전으로 테스트 하였습니다. OpenSSL 1.X 버전에서 사용가능한 함수가 3.0 이상에서는 사용되지 않는 경우가 있으니 참고해주세요.
2023.10.28 - [OpenSSL] - [OpenSSL] OpenSSL 설치 방법 리눅스(Linux)
2023.10.29 - [OpenSSL] - [OpenSSL] OpenSSL 공식사이트에서 설치 in 윈도우(Windows 11)
CLI를 통한 AES 암호화
input.txt는 암호화할 원본 파일을 하나 생성하겠습니다.
openssl 명령어만 치면 다음과 같이 어떤 방식으로 암호화할지 선택지가 뜹니다.
AES-256-CBC로 암호화를 예시로 사용하겠습니다.
$ openssl enc -aes-256-cbc -pbkdf2 -in input.txt -out encrypted.bin
각 옵션에 대한 설명은 다음과 같습니다.
openssl enc
: OpenSSL을 사용하여 데이터를 암호화 또는 복호화하는 명령입니다. enc는 encrypt의 앞글자입니다.-aes-256-cbc
: AES 알고리즘을 사용하여 데이터를 암호화하겠다는 옵션입니다. 여기서aes-256-cbc
는 256비트 키를 사용하는 CBC 모드를 나타냅니다.-pbkdf2
: 이 옵션은 OpenSSL이 비밀번호 기반 키 생성 함수로 PBKDF2를 사용하여 키를 유도하도록 지시합니다. 이는 암호화에 사용되는 키를 더욱 안전하게 만듭니다.-in input.txt
: 암호화할 원본 파일의 경로를 지정합니다. 이 예제에서는input.txt
를 암호화합니다.-out encrypted.bin
: 암호화된 결과를 저장할 파일의 경로를 지정합니다. 이 예제에서는encrypted.bin
파일에 암호문을 저장합니다.
다음 명령어로 encrypted.bin을 읽어보겠습니다. -b 옵션은 binary 라는 뜻으로 이진 파일을 수정할 때 사용합니다.
$ vim -b encrypted.bin
-pbkdf2
는 OpenSSL에서 사용되는 옵션 중 하나로, PBKDF2(Password-Based Key Derivation Function 2)를 사용하여 비밀번호로부터 안전한 키를 생성하는 방법을 지정합니다.
PBKDF2는 주어진 비밀번호와 솔트(Salt)를 사용하여 특정 횟수만큼의 해싱 작업을 수행하여 최종적으로 안전한 키를 생성합니다. 이렇게 생성된 키는 일반적으로 암호화에 사용됩니다.
-pbkdf2
옵션을 사용하면 OpenSSL은 비밀번호와 솔트를 기반으로 PBKDF2를 수행하여 안전한 키를 생성합니다.
기본적으로 OpenSSL은 무작위로 키와 IV를 생성합니다. 그러나 직접 지정할 수도 있습니다.
키 및 IV 지정
- -k 옵션을 사용하여 키를 직접 지정할 수 있습니다. 부분에 사용자가 직접 값을 지정해줍니다.
openssl enc -aes-256-cbc -k <Password> -pbkdf2 -in input.txt -out encrypted.bin
- -iv 옵션을 사용하여 IV를 직접 지정할 수 있습니다. 여기서 IV(Initiallization Vector)의 길이는 32로 맞춰야합니다.
openssl enc -aes-256-cbc -iv 0123456789abcdef0123456789abcdef -pbkdf2 -in input.txt -out encrypted.bin
CLI를 통한 AES 복호화
다음 명령어를 통해 복호화 가능합니다.
$ openssl enc -d -aes-256-cbc -pbkdf2 -in encrypted.bin -out decrypted.txt
암호화 방식 선택
위의 예에서는 AES-256-CBC를 사용했지만, AES-128, AES-192 또는 다른 블록 암호화 모드를 선택할 수 있습니다. 적절한 모드는 사용 사례와 보안 요구 사항에 따라 다를 수 있습니다.
기억해야 할 중요한 점은, 보안을 위해서는 암호화와 복호화에 사용되는 키를 안전하게 관리해야 합니다. 이를 위해 키를 하드코딩하거나 공개적으로 공유하는 것은 좋지 않습니다.
또한, CLI를 통한 기본적인 암호화 방법을 제공하며, 실제 응용 프로그램에서는 OpenSSL 라이브러리를 사용하여 프로그래밍 방식으로 암호화를 수행하는 것이 일반적입니다.
C 언어를 사용하여 OpenSSL 라이브러리를 이용하여 AES 암호화를 수행하는 예제 코드를 아래에 제공합니다. 이 코드는 AES-256-CBC 모드를 사용하고, 하드코딩된 키와 IV를 사용합니다. 실제 애플리케이션에서는 키와 IV를 안전하게 관리해야 합니다.
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
void encrypt(unsigned char *plaintext, int plaintext_len, unsigned char *key, unsigned char *iv, unsigned char *ciphertext) {
EVP_CIPHER_CTX *ctx;
ctx = EVP_CIPHER_CTX_new();
EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
EVP_EncryptUpdate(ctx, ciphertext, &plaintext_len, plaintext, plaintext_len);
int ciphertext_len;
EVP_EncryptFinal_ex(ctx, ciphertext + plaintext_len, &ciphertext_len);
EVP_CIPHER_CTX_free(ctx);
}
void decrypt(unsigned char *ciphertext, int ciphertext_len, unsigned char *key, unsigned char *iv, unsigned char *decryptedtext) {
EVP_CIPHER_CTX *ctx;
ctx = EVP_CIPHER_CTX_new();
EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
EVP_DecryptUpdate(ctx, decryptedtext, &ciphertext_len, ciphertext, ciphertext_len);
int decryptedtext_len;
EVP_DecryptFinal_ex(ctx, decryptedtext + ciphertext_len, &decryptedtext_len);
EVP_CIPHER_CTX_free(ctx);
}
int main() {
unsigned char key[32] = "0123456789abcdef0123456789abcdef";
unsigned char iv[16] = "0123456789abcdef";
unsigned char plaintext[] = "Hello, AES_CBC!!";
int plaintext_len = strlen((char*)plaintext);
unsigned char ciphertext[64]; // 충분한 크기로 할당
unsigned char decryptedtext[64]; // 충분한 크기로 할당
encrypt(plaintext, plaintext_len, key, iv, ciphertext);
decrypt(ciphertext, plaintext_len, key, iv, decryptedtext);
// C언어에서 문자열의 마지막은 항상 \0로 끝나야함
decryptedtext[strlen((char*)plaintext)] ='\0';
printf("Original: %s\n", plaintext);
printf("Encrypted: ");
for(int i = 0; i < plaintext_len; i++) {
printf("%02x ", ciphertext[i]);
}
printf("\n");
printf("Decrypted: %s\n", decryptedtext);
return 0;
}
빌드 명령어
$ gcc <파일이름>.c -Wall -o aes_cbc -lcrypto
위 코드는 OpenSSL 라이브러리를 사용하여 AES-256-CBC 암호화를 수행합니다. 키와 IV는 각각 32바이트와 16바이트로, 문자열로 표현되어 있습니다.
모든 사용법은 OpenSSL 공식사이트에서 확인 가능하며 기능이 많아 미로를 찾는 느낌일텐데 익숙해지면 금방 합니다.
/docs/manpages.html
Manpages The manual pages for all releases are available online: You are here: Home : Documentation : Manpages Sitemap
www.openssl.org
'Network > OpenSSL' 카테고리의 다른 글
Open Quantum Safe의 liboqs(양자내성암호 라이브러리) 빌드 (1) | 2024.01.06 |
---|---|
[OpenSSL] BigInteger 빅 넘버 라이브러리 (0) | 2023.11.07 |
[OpenSSL] OpenSSL 공식사이트에서 설치 in 윈도우(Windows 11) (1) | 2023.10.29 |
[OpenSSL] OpenSSL 설치 방법 리눅스(Linux) (1) | 2023.10.28 |
[OpenSSL] OpenSSL 이란? (0) | 2023.10.27 |