RSA 개인 키를 사용하여 공개 키를 생성 하시겠습니까?


394

나는 이것을 정말로 이해하지 못한다.

http://www.madboa.com/geek/openssl/#key-rsa 에 따르면 개인 키에서 공개 키를 생성 할 수 있습니다.

openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub

나의 초기 생각은 그것들이 함께 쌍으로 생성된다는 것이었다. RSA 개인 키에 합계가 포함되어 있습니까? 또는 공개 키?


1
rsa와 openssl을 사용하고 5KB와 같은 큰 파일을 암호화하려는 모든 사람에게. 공개 키의 크기가 암호화하려는 크기에 비례하거나 커야한다는 점을 기억하십시오. 그렇지 않으면 "암호화 오류 파일"이 표시됩니다. 나는 당신이 다소 크고 심각한 개인 키를 생성하고 그로부터 개인 키를 만들어서 많은 데이터를 가지고 있다고 요약합니다. 나는 openssl에서 결함에 대해 아는 사람에게 말했고, 그들은 스스로 그것을 루프로 만들어야한다고 말합니다.
Kent Hansen

10
Kent Hansen이 설명하는 문제는 일반 텍스트 데이터에서 직접 RSA를 사용하기 때문에 발생하므로 보안상의 이유로 어떠한 경우에도 절대 수행해서는 안됩니다. 대신 RSA-KEM ( tools.ietf.org/html/rfc5990#appendix-A ) 과 같이 잘 분석 된 하이브리드 암호화 체계 를 사용하고 데이터에 적용된 HMAC와 같은 인증 된 대칭 암호화 체계를 사용하십시오.
Daira Hopwood

도움이 될 수 있습니다 : jason4zhu.blogspot.jp/2014/10/…
Judking


이 링크 SteffenUllrich의 대답은 이유를 설명 @ security.stackexchange.com/questions/172274/...
bearzyj

답변:


577
openssl genrsa -out mykey.pem 1024

실제로 공개-개인 키 쌍을 생성합니다. 쌍은 생성 된 mykey.pem파일에 저장 됩니다.

openssl rsa -in mykey.pem -pubout > mykey.pub

공개 키를 추출하여 인쇄합니다. 다음 은이를 더 잘 설명하는 페이지에 대한 링크입니다.

편집 : 여기에 예제 섹션을 확인 하십시오 . 개인 키의 공개 부분 만 출력하려면 다음을 수행하십시오.

openssl rsa -in key.pem -pubout -out pubkey.pem

SSH 목적으로 사용 가능한 공개 키를 얻으려면 ssh-keygen을 사용하십시오 .

ssh-keygen -y -f key.pem > key.pub

50
어디서나 튜토리얼의 모든 사람들이 openssl genrsa 명령을 사용하여 공개 키를 생성하는 것을 잊었 기 때문에 PRIVATE KEY를 생성한다고 말하는 것은 혼란 스럽습니다.
Jaime Hablutzel

15
@ jaime 당신은 정말 그들을 비난 할 수 있습니까? 공식 문서는 공개 키에 대해 전혀 아무것도 말하지 않습니다. "설명 : genrsa 명령은 RSA 개인 키를 생성합니다." openssl.org/docs/apps/genrsa.html
Despertar

124
@jaime, 그게 아니기 때문입니다-genrsa는 개인 키 만 생성하고 공개 키는 저장되지 않습니다. 그러나 개인 키가있는 경우 공개 키를 계산 (유도) 할 수 있습니다. 이는 위의 두 번째 명령입니다. 공개 키를 추출하는 것이 아니라 계산합니다.
steveayre 2013

13
@ steveayre RSA 키가 단순히 두 지수 ( ed공통 문헌) 임을 이해했습니다 . 하나는 수학적으로 사적인 것이거나 공개적인 것이 아니며 , 레이블은 생성시 임의로 할당됩니다. 그것들은 쉽게 쉽게 역순으로 할당 될 수 있습니다. 다른 것을 생성하는 것은 동등한 문제입니다. 이 .pem형식에는 지수와 두 키를 포함한 모든 정보가 포함 되어 있습니까?
lynks

13
@ steveayre는 대부분 잘못되었습니다. 공개 RSA 키 구성 요소 (n, e) DO는 openssl genrsa명령으로 생성 된 개인 RSA 키 파일과 함께 생성되고 포함됩니다 . 동일한 단계에서 별도의 공개 키 파일이 작성되지 않습니다. 개인 키 파일에서 공개 키를 별도의 공개 키 파일로 추출하려면 openssl rsa -in private.pem -pubout -out public.pem명령 을 사용하십시오 . 이 방법으로 공개 키를 생성하면 계산되지 않고 개인 키 파일에서 추출됩니다. 자세한 내용은 아래 답변을 참조하십시오.
golem

273

SSH 공개 키를 찾는 사람들 ...

OpenSSH와 함께 사용할 공개 키를 추출하려는 경우 공개 키를 조금 다르게 가져와야합니다.

$ ssh-keygen -y -f mykey.pem > mykey.pub

이 공개 키 형식은 OpenSSH와 호환됩니다. 공개 키를 추가하면 remote:~/.ssh/authorized_keys잘 갈 수 있습니다.


의 문서 SSH-KEYGEN(1)

ssh-keygen -y [-f input_keyfile]  

-y 이 옵션은 개인 OpenSSH 형식 파일을 읽고 OpenSSH 공개 키를 stdout에 인쇄합니다.


3
이것은 매력처럼 작동합니다! Github이 취하는 형식을 생성합니다! Github은 PEM 형식을 사용하지 않습니다.openssl rsa -in key.pem -pubout -out pubkey.pem 하지 않습니다. 이전의 분명히 그 출력이 pem 형식 공개 키로 받아 들여지지 않았습니다. "키가 잘못되었습니다. 'ssh-rsa'또는 'ssh-dss'로 시작해야합니다. 키의 공개 절반을 복사하고 있는지 확인하십시오."라는 오류가 발생했습니다. 그러나 ssh-keygen -y [-f input_keyfile] Github이 올바른 형식을 생성합니다.
Devy

71

openssl을 포함하여 RSA 개인 키를 생성하는 대부분의 소프트웨어에서 개인 키는 PKCS # 1 RSAPrivatekey 개체 또는 그 변형으로 나타납니다.

A.1.2 RSA 개인 키 구문

RSA 개인 키는 ASN.1 유형
RSAPrivateKey 로 표시되어야합니다 .

  RSAPrivateKey ::= SEQUENCE {
      version           Version,
      modulus           INTEGER,  -- n
      publicExponent    INTEGER,  -- e
      privateExponent   INTEGER,  -- d
      prime1            INTEGER,  -- p
      prime2            INTEGER,  -- q
      exponent1         INTEGER,  -- d mod (p-1)
      exponent2         INTEGER,  -- d mod (q-1)
      coefficient       INTEGER,  -- (inverse of q) mod p
      otherPrimeInfos   OtherPrimeInfos OPTIONAL
  }

보시다시피이 형식에는 모듈러스 및 공개 지수를 포함한 여러 필드가 있으므로 RSA 공개 키 에있는 정보의 엄격한 수퍼 세트입니다 .


개인 키가 주어지면 공개 키를 수학적으로 실현할 수 있습니까? RSA의 장점은 다른 하나의 키를 생성하는 것이 계산 상 불가능하다는 사실이 아닙니까?
Raam

30
@Raam : 아니요. RSA의 강점은 공개 키를 사용하여 개인 키를 생성 할 수 없다는 것입니다. 개인이 사소한 공개 양식을 생성하십시오.
James K. Polk 대통령

@GregS, 왜? 키는 계수와 지수로 구성됩니다. 이 두 숫자에서 다른 지수를 계산할 수 있으면 RSA는 쉽게 해독됩니다. 그렇다면 OpenSSL 개인 키에는 지수와 모듈러스 이상이 포함되어 있습니까?
Calmarius

1
@ 칼마 리우스 : 누가 열쇠가 계수와 지수로 구성되어 있다고 말합니까? 이는 최소 개인 키이지만 일반적으로 개인 키에는 주요 요소와 같은 다른 구성 요소가 포함됩니다. 자세한 내용은 답변을 읽으십시오.
James K. Polk 대통령

1
@JamesKPolk 반드시 그런 것은 아닙니다. 경우 공개 지수가 (즉, 비공개 지수와 동일한 특성을 갖는) 큰 다음 공개 키가 될 수있다 재구성하는 것은 불가능. 대부분의 라이브러리는이를 지원하지 않지만 RSA 암호화 시스템은 확실히 개인 키에서 공개 키를 재구성 할 필요가 없습니다.
Maarten Bodewes

34

아래의 답변은 약간 길지만 이전 답변에서 누락 된 세부 정보를 제공하기를 바랍니다. 몇 가지 관련 진술로 시작하여 마지막 질문에 대답하겠습니다.

RSA 알고리즘을 사용하여 무언가를 암호화하려면 계수와 암호화 (공용) 지수 쌍 (n, e)이 필요합니다. 그게 당신의 공개 열쇠입니다. RSA 알고리즘을 사용하여 무언가를 해독하려면 계수와 해독 (비공개) 지수 쌍 (n, d)이 필요합니다. 그게 당신의 개인 열쇠입니다.

RSA 공개 키를 사용하여 무언가를 암호화하려면 일반 텍스트를 숫자로 취급하고 e 모듈러스 n의 제곱으로 올립니다.

ciphertext = ( plaintext^e ) mod n

RSA 개인 키를 사용하여 무언가를 해독하려면 암호문을 숫자로 취급하고 d 모듈러스 n의 제곱으로 올립니다.

plaintext = ( ciphertext^d ) mod n

openssl을 사용하여 개인 (d, n) 키를 생성하려면 다음 명령을 사용할 수 있습니다.

openssl genrsa -out private.pem 1024

openssl을 사용하여 개인 키에서 공개 (e, n) 키를 생성하려면 다음 명령을 사용할 수 있습니다.

openssl rsa -in private.pem -out public.pem -pubout

위의 openssl 명령으로 생성 된 private.pem 개인 RSA 키의 내용을 분석하려면 다음을 실행하십시오 (여기서 레이블로 잘린 출력).

openssl rsa -in private.pem -text -noout | less

modulus         - n
privateExponent - d
publicExponent  - e
prime1          - p
prime2          - q
exponent1       - d mod (p-1)
exponent2       - d mod (q-1)
coefficient     - (q^-1) mod p

개인 키는 (n, d) 쌍으로 만 구성되어서는 안됩니까? 6 개의 추가 구성 요소가있는 이유는 무엇입니까? private.pem 개인 RSA 키에서 공개 RSA 키를 생성 / 추출 / 파생 할 수 있도록 e (공개 지수)를 포함합니다. 나머지 5 개의 구성 요소는 해독 프로세스 속도를 높이기 위해 존재합니다. 5 개의 값을 사전 계산하고 저장함으로써 RSA 암호 해독 속도를 4 배로 높일 수 있다는 것이 밝혀졌습니다. 암호 해독은 5 개의 구성 요소없이 작동하지만 편리하다면 더 빠르게 수행 할 수 있습니다. 가속 알고리즘은 Chinese Remainder Theorem을 기반으로합니다 .

예. private.pem RSA 개인 키에는 실제로 이러한 8 개의 값이 모두 포함됩니다. 이전 명령을 실행할 때 그 중 어느 것도 즉시 생성되지 않습니다. 다음 명령을 실행하고 출력을 비교하십시오.

# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der

# Print private.der private key contents as binary stream
xxd -p private.der

# Now compare the output of the above command with output 
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less

이 RSA 개인 키 구조는 PKCS # 1 v1.5 에서 대체 ( 두 번째 ) 표현 으로 권장됩니다 . PKCS # 1 v2.0 표준은 대체 표현에서 e 및 d 지수를 모두 제외합니다. PKCS # 1 v2.1v2.2 는 선택적으로 더 많은 CRT 관련 구성 요소를 포함하여 대체 표현에 대한 추가 변경을 제안합니다.

public.pem 공개 RSA 키의 내용을 보려면 다음을 실행하십시오 (여기서 레이블로 잘린 출력).

openssl rsa -in public.pem -text -pubin -noout

Modulus             - n
Exponent (public)   - e

여기서 놀랄 일은 없습니다. 약속대로 그것은 단지 (n, e) 쌍입니다.

이제 마지막 질문에 답하십시오. 위에 표시된 것처럼 openssl을 사용하여 생성 된 개인 RSA 키에는 공개 키와 개인 키의 구성 요소가 포함되어 있습니다. 개인 키에서 공개 키를 생성 / 추출 / 추출 할 때 openssl은 해당 구성 요소 중 두 개 (e, n)를 별도의 파일로 복사하여 공개 키가됩니다.


"개인 키에서 공개 (d, n) 키를 생성하려면 ..."을 작성했습니다. "(e, n)"이 아니어야합니까? 그래도 큰 답변 감사합니다!
elactic

v1.5의 (외부) '구문'을 이후 버전의 시맨틱과 비교하고 있습니다. 2.0 # 11.1.2 및 2.1 및 2.2 # A.1.2를 확인하면 n, e, d가 여전히 존재하는 것을 볼 수 있습니다. (James Polk의 답변이 이미 언급
되었 듯이

1
놀라운 설명. 감사합니다
Francisco Albert

1
공개 지수 e는 항상 65537 인 것으로 보입니다 0x010001. 아마도 공개 지수를 선택하기위한 사실상의 사실 일 것입니다. 이것은 아마도 man page에서 거의 모든 곳 genrsa으로 설명됩니다 to generate the private key. 대중은 다소 명백합니다.
샴푸

(n, d) 에서만 (n, e)를 계산할 수 있습니까 ?
Flyq

21

일부 사람들은 공개 키가 PEM 파일에 저장되지 않습니다. 개인 키 파일에는 다음과 같은 DER 구조가 있습니다.

openssl rsa-텍스트 -mykey.pem

RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

따라서 공개 키 (모듈러스 및 공개 지수)를 계산하기에 충분한 데이터 openssl rsa -in mykey.pem -pubout가 있습니다.


개인 키와 마찬가지로 파생 가능하지만 공개 키가 저장되어 있지 않지만 개인 키도 저장되어 있지 않습니까?! 그러나 내가 pem 파일을 고양이로 만들면 개인 키와 일부 ASCII가 표시됩니다.
barlop

2
개인 키도 파생됩니다. privateExponent 필드를보십시오. 당신은 OpenSSL은 RSA -text -in mykey.pem 사용하여 필드를 볼 수 있습니다
Uxio

2
공개 키는 실제로 pem에 저장됩니다. pem에는 e 및 d, 즉 공개 키도 포함되기 때문입니다. 이산 로그 알고리즘과 달리 rsa 공개 키는 개인 키 (d, n)만으로는 계산할 수 없습니다. rsa 스펙은 개인 키 및 기타 정보와 함께 저장하도록 표시하기 때문에 존재합니다.
Michael Chourdakis

1
그렇습니다.이 답변은 모든 의도와 목적으로 잘못되었습니다 . 공개 지수와 모듈러스가 모두 있으므로 공개 키가 확실히 있습니다. 계산없이 공개 키를 쉽게 검색하는 것 외에는 공개 지수가 필요 하지 않습니다 .
Maarten Bodewes

1
@MaartenBodewes : 정답입니다. 인용 된 것은 PRIVATE 키에 저장된 값으로 관련 RFC에서 가져옵니다. 공개 키 암호화에만 사용되는 두 값은 개인 키 데이터임을 변경하지 않습니다. 나는 지난 이틀 동안 질문을하는 것이 아니라 관련 표준을 찾아 읽음으로써이 모든 것을 배웠다. 나는 이제 ASN.1, DER, PEM 및 RSA에 대한 모든 것을 이해합니다 (아마도 RSA에 관한 것은 아닙니다).
AlastairG

8

이 코드에서는 먼저 개인용 RSA 키를 생성하지만 공개 키 쌍을 가지고 있으므로 실제 공개 키를 얻으려면 간단히

openssl rsa -in mykey.pem -pubout > mykey.pub

더 많은 정보를 얻으려면 이것을 확인하십시오.


6

먼저 RSA 키 생성에 대한 간단한 요약입니다.

  1. 적절한 크기 (p 및 q)의 두 개의 임의의 가능성있는 소수를 무작위로 선택하십시오.
  2. 두 소수를 곱하여 계수 (n)를 생성합니다.
  3. 공개 지수를 선택하십시오 (e).
  4. 소수 및 공공 지수를 사용하여 일부 지수를 계산하여 개인 지수 (d)를 생성하십시오.

공개 키는 모듈러스와 공개 지수로 구성됩니다.

최소 개인 키는 모듈러스와 개인 지수로 구성됩니다. 알려진 계수와 개인 지수에서 해당하는 공개 지수로 갈 수있는 계산 가능한 확실한 방법은 없습니다.

하나:

  1. 실제 개인 키 형식은 거의 항상 n 이상을 저장합니다.
  2. e는 일반적으로 무작위로 선택되지 않으며 소수의 잘 알려진 값 중 하나가 사용됩니다. e가 잘 알려진 값 중 하나이고 d를 알고 있다면 시행 착오를 통해 e를 쉽게 파악할 수 있습니다.

따라서 대부분의 실제 RSA 구현에서는 개인 키에서 공개 키를 얻을 수 있습니다. 이것이 불가능한 RSA 기반의 암호화 시스템을 구축하는 것은 가능할 것이지만, 완료된 것은 아닙니다.


1
Use the following commands:

1. openssl req -x509 -nodes -days 365 -sha256 -newkey rsa:2048 -keyout mycert.pem -out mycert.pem

Loading 'screen' into random state - done
Generating a 2048 bit RSA private key
.............+++
..................................................................................................................................................................+++
writing new private key to 'mycert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

2. If you check there will be a file created by the name : mycert.pem

3. openssl rsa -in mycert.pem -pubout > mykey.txt
writing RSA key

4. If you check the same file location a new public key : mykey.txt will be created.

1
이것은 바보입니다. 키 페어 만 있으면 쓸모없는 인증서를 만들기 위해 추가 노력을 기울일 필요가 없습니다. 인증서를 원하는 다른 Q의 경우 답변이 될 수 있습니다.
dave_thompson_085
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.