Podstawa wykładowa: Część 4 - slajdy 6, 7, 37: historia RSA, generowanie kluczy p i q, moduł n = p*q, wykładnik publiczny e=65537, wykładnik prywatny d,
struktura formatów PEM i ASN.1.
Cel
Celem zadania jest praktyczne zapoznanie się z procedurą generowania asymetrycznych par kluczy algorytmu RSA o długości 2048 oraz 4096 bitów. Student bada wewnętrzną strukturę
matematyczną klucza zapisanego w formacie PEM, dekoduje strukturę ASN.1 DER za pomocą narzędzi OpenSSL oraz CyberChef i identyfikuje składowe n, e, d, p, q oraz wykładniki CRT.
Scenariusz – opis
Zadanie rozpoczynasz od otwarcia konsoli linuksowej JSLinux Alpine z biblioteką OpenSSL oraz serwisu CyberChef w przeglądarce internetowej. Kryptografia asymetryczna opiera się
na parze powiązanych matematycznie kluczy, z których jeden jest udostępniany publicznie, a drugi musi pozostać ściśle tajny. W algorytmie RSA klucz opiera się na iloczynie dwóch wielkich
liczb pierwszych p oraz q, które tworzą moduł publiczny n. Standardowo jako wykładnik publiczny e stosuje się liczbę pierwszą Fermata F4 równą 65537, która umożliwia efektywne obliczanie
potęg modularnych. Klucz prywatny d jest odwrotnością modularną wykładnika e względem funkcji Eulera fi(n), co wynika z rozszerzonego algorytmu Euklidesa. W systemach produkcyjnych
klucze kryptograficzne są kodowane w standardzie ASN.1 z serializacją DER i opakowywane w czytelny format PEM z nagłówkami BASE64.
Co ma wykonać student / grupa
W terminalu JSLinux wykonujesz polecenie generowania klucza prywatnego RSA
o długości 2048 bitów za pomocą nowoczesnego polecenia openssl genpkey. Zapisujesz wygenerowany klucz do pliku klucz_prywatny_2048.pem i wyświetlasz jego
tekstową reprezentację za pomocą edytora lub polecenia cat. Zauważasz charakterystyczne nagłówki BEGIN PRIVATE KEY oraz zakodowany blok znaków
alfanumerycznych w formacie Base64. Wyodrębniasz powiązany klucz publiczny za pomocą polecenia openssl pkey z parametrem -pubout do pliku
klucz_publiczny_2048.pem.
Przeprowadzasz szczegółową inspekcję klucza prywatnego poleceniem openssl rsa z flagą -text i -noout, odczytując wartości szesnastkowe
wszystkich parametrów. Identyfikujesz w wyjściu moduł n o długości 2048 bitów, publiczny wykładnik e, tajny wykładnik d oraz składowe liczby pierwsze p i q. Odnotowujesz także obecność
współczynników dP, dQ i qInv służących do przyspieszenia deszyfrowania na mocy chińskiego twierdzenia o resztach CRT. Kopiujesz zawartość pliku klucz_prywatny_2048.pem i wklejasz go do
panelu wejściowego serwisu CyberChef.
W CyberChef dodajesz operację Parse ASN.1 i analizujesz drzewo sekwencji ASN.1 opisane standardem PKCS#8 i PKCS#1. Weryfikujesz, że struktura ASN.1 klucza
publicznego zawiera wyłącznie moduł oraz wykładnik publiczny, nie zdradzając parametrów tajnych. Powtarzasz generowanie dla klucza o długości 4096 bitów i mierzysz czas operacji
poleceniem time w terminalu JSLinux, raportując czas wyłącznie względnie (stosunek 4096 vs 2048 na tym samym hoście, bez porównań między studentami). Jeżeli emulator JSLinux zamula
przy RSA-4096 i generowanie grozi przekroczeniem limitu zajęć, stosujesz awaryjny wariant 3072 bitów (openssl genpkey -pkeyopt rsa_keygen_bits:3072) i
odnotowujesz to w sprawozdaniu.
Zabezpieczasz klucz prywatny hasłem z wykorzystaniem algorytmu AES-256 poleceniem openssl rsa -aes256 i obserwujesz zmianę
nagłówka PEM. Zapisujesz wszystkie zrzuty ekranu, wygenerowane fragmenty ASN.1 oraz heksadecymalne postacie parametrów modularnych.
Sporządzasz tabelę zestawiającą parametry klucza 2048-bitowego oraz 4096-bitowego wraz z liczbą bajtów ich reprezentacji DER. Weryfikujesz spójność wszystkich zebranych
materiałów i przygotowujesz dokumentację do sprawozdania.
Przykładowe kroki do wykonania jako sugestia
- Otwórz w przeglądarce terminal JSLinux Alpine oraz serwis CyberChef.
-
W konsoli JSLinux wygeneruj klucz prywatny
RSA
2048-bit: openssl genpkey
-algorithm RSA -out rsa_priv_2048.pem
-pkeyopt rsa_keygen_bits:2048.
- Wyświetl zawartość pliku klucza poleceniem:
cat rsa_priv_2048.pem.
-
Wyeksportuj klucz publiczny:
openssl pkey -in
rsa_priv_2048.pem -pubout -out rsa_pub_2048.pem.
-
Wyświetl zawartość wygenerowanego klucza publicznego:
cat rsa_pub_2048.pem.
-
Wykonaj pełną inspekcję składowych klucza prywatnego:
openssl rsa
-in rsa_priv_2048.pem -text -noout.
-
Zanotuj wartości modułu n, wykładnika e (
0x10001), wykładnika d oraz czynników pierwszych prime1 i prime2.
-
Wykonaj inspekcję klucza publicznego:
openssl rsa -pubin
-in rsa_pub_2048.pem -text -noout.
-
Przekonwertuj klucz
PEM do formatu binarnego DER:
openssl rsa -in rsa_priv_2048.pem
-outform DER -out rsa_priv.der.
-
Zbadaj strukturę
ASN.1 w konsoli poleceniem: openssl
asn1parse -in rsa_priv_2048.pem.
-
Wklej zawartość pliku
rsa_priv_2048.pem do narzędzia CyberChef i użyj operacji Parse
ASN.1.
-
Wygeneruj klucz o długości 4096 bitów mierząc czas:
time openssl
genpkey -algorithm RSA -out
rsa_priv_4096.pem -pkeyopt rsa_keygen_bits:4096 (raportuj tylko czas względny 4096 vs
2048 na tym samym hoście; awaryjnie, gdy emulator zamula, użyj 3072 bitów:
-pkeyopt rsa_keygen_bits:3072).
-
Zabezpiecz klucz prywatny hasłem:
openssl rsa -in
rsa_priv_2048.pem -aes256 -out rsa_priv_enc.pem.
-
Sprawdź nagłówki zaszyfrowanego pliku
PEM poleceniem cat
rsa_priv_enc.pem i zidentyfikuj deklarację algorytmu szyfrowania klucza.
-
Wykonaj zrzuty ekranu drzewa
ASN.1 w CyberChef oraz wyjścia tekstowego
openssl rsa -text.
-
Sporządź tabelę porównawczą rozmiarów kluczy 2048 i 4096 bitów w formatach
PEM i
DER oraz czasów ich generowania.
Kontrola zaliczenia (checklist):
- Zachowano artefakt: klucze RSA-2048 i RSA-4096 (.pem) z logiem generowania, wyodrębniony klucz publiczny oraz dekod ASN.1 (openssl rsa/asn1parse + CyberChef) ze wskazaniem n,e,d,p,q i CRT.
- Dołączono 2–3 zrzuty z podpisami: generowanie w JSLinux, struktura ASN.1 oraz pomiar czasu generowania 2048 vs 4096 na tym samym hoście (względnie).
- Opisano w 2–3 zdaniach wybór narzędzi (OpenSSL do generowania, CyberChef do wizualizacji ASN.1/PEM) i formaty PKCS#1 vs PKCS#8.
- Zapisano wnioski (3–5 zdań): rola n,e,d,p,q, Base64 vs DER, ochrona klucza hasłem, narzut 4096 (awaryjnie 3072).
Wariant offline (fallback): Brak sieci/JSLinux: lokalny OpenSSL (Git-Bash/WSL) na plikach ze startera; CyberChef/kalkulatory zastąp opisem z cache i logiem openssl (rsa/ec/pkeyutl/derive/verify); dołącz pliki .pem/.der i zrzuty.
Sugerowane wnioski i podsumowanie - co student ma osiągnąć
Sprawozdanie z realizacji zadania musi zawierać następujące kluczowe wnioski i osiągnięcia:
- Zrozumienie matematycznej budowy pary kluczy RSA: roli modułu n, wykładnika e, wykładnika d oraz liczb pierwszych p i q.
- Znajomość struktury formatu PEM (Base64) oraz binarnego formatu ASN.1 DER (PKCS#1 i PKCS#8).
- Praktyczna umiejętność bezpiecznego wyodrębniania klucza publicznego oraz zabezpieczania klucza prywatnego szyfrem symetrycznym.
-
Świadomość narzutu wydajnościowego generowania kluczy o długości 4096 bitów w stosunku do standardu 2048 bitów (czasy raportowane wyłącznie względnie na tym samym hoście;
wariant awaryjny 3072 bity).