Moja odpowiedź poniżej jest nieco długa, ale mam nadzieję, że zawiera pewne szczegóły, których brakuje w poprzednich odpowiedziach. Zacznę od kilku powiązanych ze sobą stwierdzeń i na koniec odpowiem na wstępne pytanie.
Aby zaszyfrować coś przy użyciu algorytmu RSA, potrzebujesz modułu i pary wykładników szyfrowania (publicznego) (n, e). To twój klucz publiczny. Aby odszyfrować coś przy użyciu algorytmu RSA, potrzebujesz modułu i pary wykładników (prywatnych) wykładników (n, d). To twój klucz prywatny.
Aby zaszyfrować coś przy użyciu klucza publicznego RSA, traktujesz swój tekst jawny jako liczbę i podnosisz go do potęgi modułu e:
ciphertext = ( plaintext^e ) mod n
Aby odszyfrować coś za pomocą klucza prywatnego RSA, traktujesz swój tekst zaszyfrowany jako liczbę i podnosisz go do potęgi modułu d:
plaintext = ( ciphertext^d ) mod n
Aby wygenerować klucz prywatny (d, n) za pomocą openssl, możesz użyć następującego polecenia:
openssl genrsa -out private.pem 1024
Aby wygenerować klucz publiczny (e, n) z klucza prywatnego za pomocą openssl, możesz użyć następującego polecenia:
openssl rsa -in private.pem -out public.pem -pubout
Aby przeanalizować zawartość prywatnego.pem prywatnego klucza RSA wygenerowanego przez powyższe polecenie openssl, uruchom następujące polecenie (dane wyjściowe są obcięte tutaj do etykiet):
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
Czy klucz prywatny nie powinien składać się tylko z pary (n, d)? Dlaczego jest 6 dodatkowych komponentów? Zawiera e (wykładnik publiczny), dzięki czemu publiczny klucz RSA może zostać wygenerowany / wyodrębniony / wyprowadzony z prywatnego.pem prywatnego klucza RSA. Pozostałe 5 elementów ma przyspieszyć proces odszyfrowywania. Okazuje się, że przez wstępne obliczenie i przechowanie tych 5 wartości można przyspieszyć odszyfrowanie RSA czterokrotnie. Odszyfrowanie będzie działać bez tych 5 składników, ale można to zrobić szybciej, jeśli masz je pod ręką. Algorytm przyspieszenia oparty jest na chińskim twierdzeniu o pozostałej liczbie .
Tak, private.pem Klucz prywatny RSA zawiera wszystkie te 8 wartości; żadne z nich nie jest generowane w locie po uruchomieniu poprzedniego polecenia. Spróbuj uruchomić następujące polecenia i porównaj dane wyjściowe:
# 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
Ta struktura klucza prywatnego RSA jest zalecana przez PKCS # 1 v1.5 jako alternatywna ( druga ) reprezentacja. Standard PKCS # 1 v2.0 całkowicie wyklucza wykładniki e i d z alternatywnej reprezentacji. PKCS # 1 v2.1 i v2.2 proponują dalsze zmiany w alternatywnej reprezentacji, opcjonalnie włączając więcej komponentów związanych z CRT.
Aby zobaczyć zawartość publicznego.pem publicznego klucza RSA, uruchom następujące polecenie (dane wyjściowe są obcięte do etykiet tutaj):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
Żadnych niespodzianek. To tylko (n, e) para, jak obiecano.
Teraz w końcu odpowiadając na początkowe pytanie: Jak pokazano powyżej, prywatny klucz RSA wygenerowany za pomocą openssl zawiera składniki zarówno klucza publicznego, jak i prywatnego i kilka innych. Kiedy generujesz / wyodrębniasz / wyprowadzasz klucz publiczny z klucza prywatnego, openssl kopiuje dwa z tych składników (e, n) do osobnego pliku, który staje się twoim kluczem publicznym.