기본 콘텐츠로 건너뛰기

추천 가젯

OpenSSL 명령으로 RSA 개인키와 공개키 매칭 확인하기

Modulus 모듈러스 는 RSA 공개 키 알고리즘에서 사용하는 핵심 숫자 값으로 크기가 다른 매우 큰 두 소수의 곱이다. 공개키 와 개인키 에 모두 포함되어 있으므로 모듈러스 값을 비교하는 것으로 키 쌍이 서로 매칭되는지 확인할 수 있다. 키에서 모듈러스 값 확인하기 openssl rsa의 -modulus 옵션을 이용하여 키의 모듈러스 값을 확인할 수 있다. 개인 키의 모듈러스 값 확인하기 openssl rsa -in private.pem -modulus -noout openssl rsa : openssl의 RSA 기능을 이용한다. -in [개인키 파일 경로] : 개인키 파일 경로를 입력한다. 필자는 'private.pem' 파일로 지정했다. -modulus : RSA 키 모듈러스를 출력한다. -noout : 키를 출력하지 않는다. 위 명령을 실행하면 MODULUS=... 가 표시된다. 공개 키의 모듈러스 값 확인하기 openssl rsa -pubin -in public.pem -modulus -noout -pubin : 입력 파일로써 공개키를 지정한다. 결과는 위와 마찬가지로 MODULUS=... 로 표시된다. 이 모듈러스 값이 서로 일치하는지 직접 눈으로 확인할 수 있다. 두 명령을 한 번에 실행하는 스크립트 (diff <(openssl rsa -in [비밀키 경로] -modulus -noout) <(openssl rsa -pubin -in [공개키 경로] -modulus -noout)) > /dev/null && echo "match" || echo "not match" 주의 : <() (프로세스 치환)은 일부 쉘에서 작동하지 않을 수 있다. 결과 두 키가 서로 쌍인 경우: match 두 키가 서로 쌍이 아닌 경우: not match diff 명령을 사용한다. diff 명령은 두 내용이 일치하면 아무런 출력도 하지 않고(return 0), 일치하지 않으면 일치하지...

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만 노출된 경우에는 그나마 암호를 복구할 정도는 아니다.

댓글

가장 많이 본 글