추천 가젯
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 -base64echo -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 99e7df26da36d7f7196c48d02ed44a94openssl 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만 노출된 경우에는 그나마 암호를 복구할 정도는 아니다.
댓글
댓글 쓰기