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

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

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

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

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



답변

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


답변

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에 인쇄합니다.


답변

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 알고리즘을 사용하여 무언가를 암호화하려면 계수와 암호화 (공용) 지수 쌍 (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)를 별도의 파일로 복사하여 공개 키가됩니다.


답변

일부 사람들은 공개 키가 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가 있습니다.


답변

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

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

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


답변

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

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

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

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

하나:

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

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