기본 콘텐츠로 건너뛰기

추천 가젯

OpenSSL 명령어로 비대칭 암호화하기 (공개키로 암호화하고 비밀키로 복호화하기)

비대칭 암호화 암호화 키와 복호화 키가 서로 다른 비대칭 암호의 특징을 이용하여 공개키로 암호화하고 비밀키로 복호화할 수 있다. 우선 이전에 생성한 private.pem 과 public.pem 이 필요하다. 비밀키는 계속 가지고 있고, 통신을 하고자 하는 사람에게 공개키를 전달한다. 그 다음 공개키를 가진 사람이 공개키로 암호화하고, 암호화한 결과를 전달한다. 이 과정은 도청되어도 비밀키를 알아낼 수 없기에 원문을 도청자가 알아낼 수 없다. 원문 준비하기 원본은 다음과 같이 준비한다. 주로 대칭 암호화를 사용할 키를 전달할 때 공개키 암호를 보조하여 사용하므로, 여기서는 키파일을 생성하겠다. echo -n "key=" > key.txt openssl rand -hex 32 >> key.txt echo -n "iv=" >> key.txt openssl rand -hex 16 >> key.txt 그러면 key와 iv가 포함된 파일이 완성된다. 이 파일을 안전하게 전달하기 위해 암호화한다. 공개키로 암호화하기 openssl pkeyutl -encrypt -pubin -inkey [public.pem] -in [key.txt] -out encrypted.bin openssl pkeyutl : openssl에서 제공하는 low-level 공개키/개인키 연산 유틸리티인 pkeyutl 을 이용한다. -encyprt : 암호화를 한다. -pubin : 입력받을 키의 종류를 공개키로 지정한다. -inkey [입력키] : 입력받을 키를 지정한다. 암호화를 할 때는 공개키를 지정한다. 필자는 'public.pem'으로 지정하였다. -in [입력파일] : 입력파일을 지정한다. 암호화를 할 때는 원문을 지정한다. 필자는 위에서 생성한 'key.txt'로 지정하였다. -out [출력파일] : 출력파일을 지정한다. 출력된 결과는 암호문이므로 저장될 이름을 지정한다. 필자는 'e...

OpenSSL 명령어로 키, IV 생성하여 대칭 암호화하기

대칭 키 생성하기

비밀번호로 키를 유도하는 PBKDF2를 이용하여 유도된 키를 사용해 암호화를 할 수 있지만, 직접 키와 IV를 지정하여 암호화할 수 있다.


AES-256-CBC에는 32바이트(256비트)의 키와 16바이트의 IV가 필요하기에, 각각 생성해 보겠다.


다른 암호화 알고리즘을 이용한다면 키의 길이가 달라지거나 IV가 필요하지 않을 수도 있으니 참고 바란다.

32바이트 키 생성하기

openssl rand -hex 32

이 명령은 32바이트(256비트)의 랜덤한 난수를 생성하여 해당 난수를 16진수로 변환하여 출력하는 명령이다.

결과로 6b53103eafc1eb85622d721d2fc0dff9044df42a628a297395b62e13aa9d423d가 출력된다. (총 64글자) 랜덤한 값이니 여러분의 값은 다를 것이다.

16바이트 IV 생성하기

openssl rand -hex 16

마찬가지로 16바이트의 난수를 생성하여 IV(초기화 벡터)를 출력해 보겠다. (총 32글자)

결과로 99e7df26da36d7f7196c48d02ed44a94가 출력된다. 마찬가지로 랜덤한 값이다.

문자열 암복호화

echo -n "문자열" | openssl enc ... 명령어로 문자열을 암복호화 할 수 있다.


문자열을 암복호화하는 사이트에서도 문자열 암복호화를 할 수 있다.

문자열 암호화

이제 Hello World 라는 문자를 앞서 생성한 키와 IV로 암호화 해 보겠다.

echo -n "Hello World" | openssl enc -aes-256-cbc -e -K 6b53103eafc1eb85622d721d2fc0dff9044df42a628a297395b62e13aa9d423d -iv 99e7df26da36d7f7196c48d02ed44a94 -base64
  • echo -n "Hello World": 문자열 "Hello World"를 개행 없이 출력한다.

  • openssl enc: openssl로 암복호화 기능을 이용하겠다는 뜻이다.

  • -aes-256-cbc: 암호화 알고리즘으로 AES-256-CBC를 이용하겠다는 뜻이다.

  • -e: 암호화를 하겠다는 뜻이다. (encrypt)

  • -K(대문자) [16진수키]: 키를 지정한다. 반드시 16진수여야 한다.

  • -iv [16진수IV]: 초기화 벡터를 지정한다. 반드시 16진수여야 한다.

  • -base64: base64로 인코딩하여 결과를 출력한다.

결과는 78tWOqs5vcfFJcdBnXXtvQ==이다. 키와 IV, 그리고 암호화할 내용이 같다면 똑같이 나온다.

문자열 복호화

이번에는 위에서 생성한 암호문을 복호화해 보겠다.

echo "78tWOqs5vcfFJcdBnXXtvQ==" | openssl enc -aes-256-cbc -d -base64 -K 6b53103eafc1eb85622d721d2fc0dff9044df42a628a297395b62e13aa9d423d -iv 99e7df26da36d7f7196c48d02ed44a94

-e 옵션이 -d 옵션으로 바뀐 것을 제외하면 내용은 같다. 다만 echo [base64]-n 옵션이 빠졌다. 즉 줄바꿈이 들어갔다는 뜻이다. base64로 인코딩된 암호문을 복호화 할 때에는 줄바꿈을 넣어야 한다.

파일 암복호화

-in, -out 옵션을 사용하여 입력파일과 출력파일을 지정할 수 있다.

파일 암호화

위에서 생성한 키와 IV를 이용하여 screenshot.png를 암호화해 보겠다.

openssl enc -aes-256-cbc -e -in screenshot.png -out encrypted.png -K 6b53103eafc1eb85622d721d2fc0dff9044df42a628a297395b62e13aa9d423d -iv 99e7df26da36d7f7196c48d02ed44a94
  • openssl enc: OpenSSL로 암복호화 기능을 사용한다.

  • -aes-256-cbc: AES 256비트를 CBC 모드로 사용한다.

  • -e: 평문을 암호문으로 암호화한다.

  • -in [입력 파일 경로]: 암호화할 파일을 지정한다. 여기서는 'screenshot.png'로 지정하였다.

  • -out [출력 파일 경로]: 암호화된 파일이 위치할 경로를 지정한다. 여기서는 'encrypted.png'로 지정했다.

  • -K [16진수키]: 위에서 생성한 32바이트 길이의 16진수 키를 입력했다.

  • -iv [16진수IV]: 마찬가지로 16진수 IV를 입력했다.

그러면 encrypted.png 파일이 생성된다. 파일을 더블클릭하여 열어보려 해도 열리지 않는다. 암호화가 되었기 때문이다.

파일 복호화

암호화된 encrypted.png 파일을 다시 복호화해 보겠다.

openssl enc -aes-256-cbc -d -in encrypted.png -out decrypted.png -K 6b53103eafc1eb85622d721d2fc0dff9044df42a628a297395b62e13aa9d423d -iv 99e7df26da36d7f7196c48d02ed44a94
  • -d: 복호화를 실행한다.

  • -in[입력 파일 경로]: 여기서는 암호화된 encrypted.png를 지정했다. 암호화된 파일 경로를 지정하면 된다.

  • -out[출력 파일 경로]: 여기서는 복호화 결과를 저장할 파일 이름으로 decrypted.png로 지정했다.

복호화한 파일을 열어 보면 문제없이 열리는 것을 확인할 수 있다.

주의점

키나 IV 둘 중 하나라도 분실하게 된다면 절대로 복호화를 할 수 없다. 그래서 키와 IV를 안전하게 보관하여야 한다. 정말로 중요한 키라면 종이에 적어 금고에 보관하는 것이 권장된다. (비트코인 지갑 개인 키처럼 말이다) 중요도가 비교적 낮다면 텍스트 파일로 저장하거나 환경변수로 저장하는 것도 고려할 수 있다. 가장 중요한 것은 키와 IV 모두를 잃어버리지 않는 것이다.


키와 IV 모두 유출되어 버린다면 누구나 복호화를 할 수 있기 때문에 즉시 키를 파기하고 새로운 키로 암호화를 다시 해야 한다. 특히 키만 노출되었다 하더라도 암호문의 상당수를 복구할 수 있다. 그러나 IV만 노출된 경우에는 그나마 암호를 복구할 정도는 아니다.

댓글

가장 많이 본 글