x0FANSA-hk 님의 블로그
OpenSSL을 사용한 파일 자동 암호화 프로그램 본문
제가 컴퓨터공학과는 아니지만, 컴퓨터를 좋아하는 사람으로써, 정보보안 동아리 MJSEC회원이었던 사람으로써 간략한 수준의 보안만큼은 알고 있습니다. 그중 제가 재미있게 보았던게 AES-256입니다. 이 암화화 알고리즘에 안좋은 기억이 있었기 때문이죠.
중학생때였는데, 그때 제가 제 휴대전화의 개인 사진들을 7z파일로 암호화해서 클라우드베리에 저장하곤 했었습니다. 폰이 오래되었고, 보급형이다보니 저장공간이 부족했기 때문이죠.(저장공간이 현재 제 노트북 램과 크기가 같아요...) 문제는 클라우드베리가 어느순간 서비스종료통보를 해서 다시 올렸던거를 다운받았습니다. 이때 초등학생때부터 찍은 사진첩을 다운받고 열려는데, 분명 제가 쓰는 비밀번호를 다 대입해봐도 안열리는 거에요. 그때 각가지 프로그램을 쓰면서 암호를 알아내는 방법을 찾았고, 이때 7z에 쓰인 암호화 알고리즘이 AES-256이라는 것도 알게 되었습니다. 그리고 어떻게 뚫는지 궁금해서 나무위키로 찾아보니...

이거 읽고 8시간동안 노력하던걸 때려쳤습니다.
아무튼간에 이러한 고생을 어렸을때 해서 그런가, 암호화알고리즘중에서 AES-256라는 이름은 잊지 않았던거 같아요.
OpenSSL
서론이 길었는데, 오늘 소개할 프로그램은 이러한 암호화 프로토콜들을 모아두고 암호화/복호화를 직접 해주기도 하는 OpenSSL입니다. 앞서 소개했던 보안계의 큰형님인 AES-256도 지원합니다. 이번 글에서 핵심은 바로 이 OpenSSL을 통해 파일을 암호화/복호화 하는 것입니다.
프로그램은 여기에서 설치하면 됩니다만, 사실 좀 복잡합니다. 그래도 다른 좋은 블로거들이 잘 설명해놓은 글들이 많아요. 거기를 참고하셔서 설치하시면 됩니다. 저는 설치가 완료되었다고 가정하고 진행할게요.
https://slproweb.com/products/Win32OpenSSL.html
Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions
Minimum system requirements: Windows XP or later 32MB RAM 200MHz CPU 30MB hard drive space Recommended system requirements: Windows XP or later 128MB RAM 500MHz CPU 300MB hard drive space April 16, 2026 - OpenSSL 4.0 is available. Users should currently in
slproweb.com


OpenSSL로 파일 암호화해보기
OpenSSL이 많은 기능을 가지고 있지만, 그중에서도 저희가 쓰려는 기능인 파일암호화 기능을 바로 써 봅시다. 암호화알고리즘으로는 AES-256을 사용할 것입니다.

이런식으로 암호화가 되지 않은 파일을 준비해줍시다. 이후 cmd에 다음과 같은 명령어를 입력하여 암호화/복호화가 가능합니다.
암호화
openssl enc -aes-256-ctr -in "C:\Users\RHK\Desktop\ENCRYPT\dynamic_type.jpg" -out "C:\Users\RHK\Desktop\ENCRYPT\dynamic_type.jpg_enc" -pass pass:"PgAzxUqtzuf6dEe42KVJvnP3jA2dRxc7" -iter 1000 -pbkdf2
복호화
openssl enc -d -aes-256-ctr -in "C:\Users\RHK\Desktop\ENCRYPT\dynamic_type.jpg_enc" -out "C:\Users\RHK\Desktop\ENCRYPT\dynamic_type.jpg" -pass pass:"PgAzxUqtzuf6dEe42KVJvnP3jA2dRxc7" -iter 1000 -pbkdf2
명령어 해석
-aes-256-ctr: AES-256의 CTR모드로 파일을 암호화하겠다는 거에요. 이것 말고도, CBC모드의 -aes-256-cbc, ECB모드의 -aes-256-ecb 명령어가 있습니다.
-iter 1000: AES-256은 사실 저희가 입력한 암호문이 그대로 비밀키로 사용되는게 아닙니다. 256이라는 이름처럼 뭘 입력하던 256비트가 키로 들어갑니다. 이때, 사용자가 입력한 암호문을 가지고 적절하게 가공해서 고유의 256비트로 만드는게 키 유도 함수 입니다. iter명령어 뒤의 숫자가 키 유도 함수에 비밀번호를 몇번 대입할지를 나타냅니다. 즉, 암호문을 알고있어도, iter횟수를 모르면 파일을 해독할 수 없습니다!
-pbkdf2: 위에서 설명한 키 유도 함수중 하나입니다. 역시, pbkdf2을 통해 암호문으로 키를 만든다면, 해독할때에도 pbkdf2을 통해서만 복호화해야합니다!
-d: 복호화하라는 명령어 입니다. 이게 빠지면 자동으로 암호화가 진행됩니다.
-in "경로": 작업을 진행할 파일의 경로와 이름을 입력합니다.
-out "경로": 작업이후 출력될 파일의 경로와 이름을 입력합니다.
-pass pass:"비밀번호": 비밀번호를 입력합니다.
암호화


명령어를 사용하여 암호화를 한 모습입니다. 확장자가 바뀐것도 있지만, 파일 바이너리가 암호화되어져 생성되었습니다.


출력된 파일의 확장자를 강제로 바꿔서 열기를 시도해보았습니다. 당연히 바이너리가 암호화되어있는 상태이기 때문에 정상적으로 열리지 않음을 확인할 수 있습니다.
복호화


명령어를 사용해서 암호화시켰던 파일을 같은 암호로 복호화하였습니다. 정상적으로 복호화됨을 확인할 수 있었습니다.
틀린 암호를 넣음
고의로 틀린 암호를 넣어서, 암호화가 잘 되었는지를 봅시다.
틀린 암호를 넣음
openssl enc -d -aes-256-ctr -in "C:\Users\RHK\Desktop\ENCRYPT\dynamic_type.jpg_enc" -out "C:\Users\RHK\Desktop\ENCRYPT\dynamic_type.jpg" -pass pass:"Hello, World" -iter 1000 -pbkdf2


일단 컴퓨터입장에서는 비밀번호랍시고 입력받은게 있기때문에, 틀린비밀번호라도 알고리즘에 맞춰 디코딩을 하고 봅니다. 즉 파일이 일단 만들어지긴 했어요.

그러나 틀린 비밀번호로 복호화되었기에, 파일이 정상적인 구조를 갖췄을 리 없습니다. 지도에는 직진후 우회전하면 편의점이 나올거라고 적혀있는데, 그게 우리집(정상 비밀번호)에서나 통하는 말이지, 북한 평양(틀린 비밀번호) 어딘가에서 통하지는 않는것과 같은 이치죠.
iter값을 다르게 함
iter값만 다르게(1000에서 4000으로), 비밀번호는 같게 명령어를 입력하였습니다.
iter값을 다르게 함
openssl enc -d -aes-256-ctr -in "C:\Users\RHK\Desktop\ENCRYPT\dynamic_type.jpg_enc" -out "C:\Users\RHK\Desktop\ENCRYPT\dynamic_type.jpg" -pass pass:"PgAzxUqtzuf6dEe42KVJvnP3jA2dRxc7" -iter 4000 -pbkdf2


분명 비밀번호를 같게 입렸했어도 파일 복호화가 실패하였습니다. 이는 키 유도 함수에 비밀번호를 몇번 대입하냐에 따라 출력이 매번 달라지기 때문이죠. 아까설명했던것처럼 iter값도 알고 있어야 정상적으로 복호화됩니다.
C언어로 만든 파일 자동 암호화 프로그램
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <bcrypt.h>
#pragma comment(lib, "bcrypt.lib")
int main() {
char inputaddress[256];
char outputaddress[256];
char passwordaddress[256];
char command[800];
const char charset[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'()*+,-./:;<=>?@[]^_`{|}~";
int iter,length,i;
char mode;
char modearr[4];
FILE *fp;
printf("OpenSSL AUTO\n");
printf("Enter Password Length: "); scanf("%d", &length); fflush(stdin);
char randomString[length+1];
NTSTATUS status=BCryptGenRandom(NULL, (unsigned char*)randomString, length, BCRYPT_USE_SYSTEM_PREFERRED_RNG);
for (i=0;i<length; i++) randomString[i]=charset[(unsigned char)randomString[i]%(sizeof(charset)-1)];
randomString[length]='\0';
MRT:
printf("\nB: CBC mode, T: CTR mode, E: ECB mode\nSelect AES-256 mode: "); scanf("%c",&mode); fflush(stdin);
switch (mode) {
case 'B': case 'b': strcpy(modearr,"cbc"); break;
case 'T': case 't': strcpy(modearr,"ctr"); break;
case 'E': case 'e': strcpy(modearr,"ecb"); break;
default: printf("Invalid!\n"); goto MRT; break;
}
printf("\nEnter Input File Address: "); scanf("%255s",inputaddress); fflush(stdin);
printf("\nEnter Output File Address: "); scanf("%255s",outputaddress); fflush(stdin);
PRT:
printf("\nEnter Password File Address: "); scanf("%255s",passwordaddress); fflush(stdin);
fp=fopen(passwordaddress,"r");
if (fp!=NULL) {
printf("\nSame Name of File already Exist!");
fclose(fp);
goto PRT;
}
fp=fopen(passwordaddress,"w");
if (fp==NULL) {
perror("Fail");
return 1;
}
printf("\nEnter iter number: "); scanf("%d",&iter); fflush(stdin);
sprintf(command,"start openssl enc -aes-256-%s -iter %d -pbkdf2 -in \"%s\" -out \"%s\" -pass pass:\"%s\"",modearr,iter,inputaddress,outputaddress,randomString);
system(command);
printf("\nYour Password: %s\nYour Command: %s", randomString,command);
fprintf(fp,"%s",randomString);
fclose(fp);
return 0;
}
파일을 복잡한 명령어 없이, 약간의 조작으로 암호화시켜주는 프로그램을 만들었습니다. 사용자가 비밀번호 자릿수를 입력하면, 그 자리에 맞게 무작위의 비밀번호로 암호화를 해줍니다. 실행을 해 보면 바로 CLI가 나옵니다.

암호문의 길이를 입력합시다. AES-256는 33자리 이상부터는 보안강도가 포화되기 때문에, 너무 많지는 않게 40으로 입력하였습니다.

AES-256중에서도 모드를 선택합니다. 저는 T를 입력하여 CTR모드를 선택하였습니다.


암호화할 파일의 경로를 입력해 주었습니다. 오류가 나지 않게 절대경로로 입력하였어요.

암호화된 출력파일의 경로를 입력해 주었습니다. 암호화할 파일과 경로까지는 같지만, 확장자로 구별되게 입력하였습니다.

이 프로그램은 파일을 암호화하기 전에, 암호를 미리 파일에 남겨둡니다. 그때 암호를 남겨둘 파일의 경로를 입력해줍니다.

iter횟수를 입력해줍니다. 저는 1000을 입력하였습니다.



이렇게 하면 완료입니다. 암호화가 다 된 것이지요. 이 과정을 통해 아래의 명령어를 입력한 것과 같은 효과를 내는데, 명령어를 직접 입력하는거보다는 이 툴을 이용하는게 보기에 편하기에 만들어보았어요.
openssl enc -d -aes-256-ctr -in "C:\Users\RHK\Desktop\ENCRYPT\dynamic_type.jpg_enc" -out "C:\Users\RHK\Desktop\ENCRYPT\dynamic_type.jpg" -pass pass:"RHfUU>kalG`Kk<xk*l(59W9Cje8a5~#$Wa!<MW0I" -iter 1000 -pbkdf2
복호화 테스트



제대로 암호화되었는지 복호화로 확인해보았습니다. 위의 명령어처럼 -d옵션을 붙여 passwordfile.txt의 비밀번호로 복호화를 시도하였고, 다행히 잘 복호화가 되었음을 확인할 수 있습니다.
'Planet' 카테고리의 다른 글
| 폴더 안 모든파일 자동 암호화 프로그램 (0) | 2026.07.18 |
|---|---|
| 74HC283과 2의 보수 (0) | 2026.07.15 |
| 디코더와 3×8디코더인 74HC138 사용해보기 (0) | 2026.07.15 |
| 자취방 식물성장 LED 자동화 시스템 (1) | 2026.07.08 |
| Windows11 Home C드라이브를 ReFS로 설정하기 (0) | 2026.07.07 |
