기본 콘텐츠로 건너뛰기

추천 가젯

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 명령으로 비대칭키(RSA, 타원곡선) 생성하기

비대칭 암호화

비대칭 암호화(공개 키 암호화) 방식은 암호화와 복호화에 같은 키를 사용하는 대칭 암호화(비밀 키 암호화)와는 다르게 암호화와 복호화에 사용되는 키가 다른 암호화 방식을 말한다.


이 방식을 이용해서 전자서명, TLS가 가능하다.

RSA

컴퓨터가 엄청나게 큰 두 소수를 생성하여 곱하는 것은 쉽지만, 소인수분해하는 것은 어렵다는 점을 이용하여 공개 키와 비공개 키를 생성해 암호화를 하는 방식이다.


평문을 비밀키로 암호화했다면 공개키로만 풀 수 있고,

평문을 공개키로 암호화했다면 비밀키로만 풀 수 있다.

openssl 명령으로 RSA 비밀키 생성하기

먼저 비밀키를 생성한다.

openssl genrsa -out private.pem 2048
  • openssl genrsa: RSA 비밀키를 생성한다

  • -out [비밀키 저장 경로]: 비밀키를 저장할 경로를 지정한다. 필자는 'private.pem'으로 지정하였다.

  • 2048: 키 길이를 2048비트로 지정한다

비밀키를 생성하였다면 내용을 확인한다. cat private.pem

-----BEGIN PRIVATE KEY-----
...(중략)
-----END PRIVATE KEY-----

비밀 키는 생성할 때마다 랜덤하게 생성되고, BEGIN PRIVATE KEYEND PRIVATE KEY 사이에 위치해 있다. 버전에 따라 'RSA'라고 추가적으로 적혀 있을 수 있다.


비밀키를 생성했다면 읽기/쓰기/실행 권한을 적절히 선택하여(chmod)지정된 사용자만 접근 가능하도록 하자.

openssl 명령으로 RSA 공개 키 생성하기

비밀키를 생성하였다면, 해당 비밀키를 이용하여 공개키를 계산할 수 있다.

openssl rsa -in private.pem -out public.pem -pubout
  • openssl rsa: openssl의 rsa 기능을 이용한다.

  • -in [비밀키 경로]:비밀키의 경로를 지정한다. 필자는 위에서 생성한 'private.pem'을 사용하였다.

  • -out [저장할 공개키 경로]: 생성된 공개키를 저장할 경로를 지정한다. 필자는 'public.pem'으로 지정하였다.

  • -pubout: 공개키를 출력하는 옵션이다.

타원곡선

타원곡선 암호는 타원곡선에서 한 점에 특정 정수를 곱하는 것은 쉽지만, 해당 결과값으로 몇 번 더했는지(이산로그 문제) 알기 어려운 수학적 난제를 이용한 암호화 알고리즘이다.


여러 종류의 타원곡선이 있으며 적절한 타원곡선을 선택할 수 있다.

openssl ecparam -list_curves

openssl 명령으로 타원곡선 비밀 키 생성하기

먼저 비밀키를 생성한다.

openssl ecparam -name prime256v1 -genkey -out ec_private.pem
  • openssl ecparam: openssl 타원곡선 기능을 이용한다.

  • -name prime256v1: 곡선의 종류로 'prime256v1'을 선택한다.

  • -genkey: 비밀키를 생성한다.

  • -out [저장될 비밀키 경로]: 계산된 비밀키를 저장할 경로를 지정한다. 필자는 'ec_private.pem'으로 지정했다.

생성된 비밀키도 마찬가지로 chmod 명령으로 읽기/쓰기/실행 권한을 적절히 세팅한다.

openssl 명령으로 타원곡선 공개키 생성하기

openssl ec -in ec_private.pem -out ec_public.pem -pubout
  • openssl ec: openssl의 타원곡선 기능을 이용한다.

  • -in [비밀키 경로]: 공개키를 생성하기 위해 비밀키 경로를 지정한다. 필자는 위에서 생성한 'ec_private.pem'으로 지정했다.

  • -out [저장될 공개키 경로]: 계산된 공개키를 저장할 경로를 지정한다. 필자는 'ec_public.pem'으로 지정했다.

  • -pubout: 비밀 키를 기반으로 공개키를 생성한다.

부록

최신 버전의 openssl을 이용한다면 최신 버전에서 권장하는 명령을 사용할 수 있다.

  • RSA

    • 비밀키 생성: openssl genpkey -algorithm RSA -out private.pem -pkeyopt rsa_keygen_bits:2048

    • 공개키 생성: openssl pkey -in private.pem -out public.pem -pubout

  • 타원곡선

    • 비밀키 생성: openssl genpkey -algorithm EC -out ec_private.pem -pkeyopt ec_paramgen_curve:prime256v1

    • 공개키 생성: openssl pkey -in ec_private.pem -out ec_public.pem -pubout

댓글

가장 많이 본 글