
Szyfrowanie asymetryczne wykorzystuje klucz asymetryczny – klucz prywatny i publiczny – w celu szyfrowania i deszyfrowania komunikatów.
Przykład
Przykład będzie wykorzystywał narzędzie openSSL.
Komunikat
Zapiszmy do pliku komunikat do zaszyfrowania:
echo "Enigma złamana przez polskich matematyków" > message.txtWybór szyfru
Zanim zaczniemy szyfrować komunikaty, musimy zdecydować jakiego szyfru użyjemy. Aby zestawić dostępne szyfry należy użyć komendy:
openssl list -public-key-algorithmsco zwróci nam listę dostępnych szyfrów (wraz z aliasami). W moim systemie jest to:
Name: OpenSSL RSA method
Type: Builtin Algorithm
OID: rsaEncryption
PEM string: RSA
Name: rsa
Alias for: rsaEncryption
Name: OpenSSL PKCS#3 DH method
Type: Builtin Algorithm
OID: dhKeyAgreement
PEM string: DH
Name: dsaWithSHA
Alias for: dsaEncryption
Name: dsaEncryption-old
Alias for: dsaEncryption
Name: dsaWithSHA1-old
Alias for: dsaEncryption
Name: dsaWithSHA1
Alias for: dsaEncryption
Name: OpenSSL DSA method
Type: Builtin Algorithm
OID: dsaEncryption
PEM string: DSA
Name: OpenSSL EC algorithm
Type: Builtin Algorithm
OID: id-ecPublicKey
PEM string: EC
Name: OpenSSL HMAC method
Type: Builtin Algorithm
OID: hmac
PEM string: HMAC
Name: OpenSSL CMAC method
Type: Builtin Algorithm
OID: cmac
PEM string: CMAC
Name: OpenSSL RSA-PSS method
Type: Builtin Algorithm
OID: rsassaPss
PEM string: RSA-PSS
Name: OpenSSL X9.42 DH method
Type: Builtin Algorithm
OID: X9.42 DH
PEM string: X9.42 DH
Name: OpenSSL X25519 algorithm
Type: Builtin Algorithm
OID: X25519
PEM string: X25519
Name: OpenSSL X448 algorithm
Type: Builtin Algorithm
OID: X448
PEM string: X448
Name: OpenSSL POLY1305 method
Type: Builtin Algorithm
OID: poly1305
PEM string: POLY1305
Name: OpenSSL SIPHASH method
Type: Builtin Algorithm
OID: siphash
PEM string: SIPHASH
Name: OpenSSL ED25519 algorithm
Type: Builtin Algorithm
OID: ED25519
PEM string: ED25519
Name: OpenSSL ED448 algorithm
Type: Builtin Algorithm
OID: ED448
PEM string: ED448
Name: sm2
Alias for: id-ecPublicKey
Generowanie klucza prywatnego
Generowanie klucza prywatnego jest najczęściej specyficzne dla danego algorytmu. Przykładowo dla algorytmu RSA o długości klucza 2048 bitów (co jest na moment pisania tego wpisu rekomendowaną długością dla RSA) możemy użyć polecenia:
openssl genpkey -algorithm rsa -out private_key.pem -pkeyopt rsa_keygen_bits:2048Eksportowanie klucza publicznego
Mając klucz prywatny, możemy z niego wyeksportować klucz publiczny:
openssl rsa -pubout -in private_key.pem -out public_key.pemSzyfrowanie komunikatu (klucz publiczny)
Aby zaszyfrować nasz komunikat użyjemy komendy (opcja -pubin jest obowiązkowa, żeby wskazać, że szyfrujemy używając klucza publicznego):
openssl pkeyutl -encrypt -in message.txt -pubin -inkey public_key.pem -out message.encOdszyfrowywanie komunikatu (klucz prywatny)
Odszyfrowywanie komunikatu jest podobne do szyfrowania:
openssl pkeyutl -decrypt -in message.enc -inkey private_key.pem -out decrypted_message.txt
Problemy…
…z szybkością szyfrowania
Algorytmy szyfrowania asymetrycznego nie są tak wydajne jak algorytmy szyfrowania symetrycznego.
…z ograniczoną długością klucza
Problemem szyfrowania asymetrycznego są ograniczenia długości szyfrowanych komunikatów.
Rozwiązanie
Rozwiązaniem powyższych problemów jest szyfrowanie hybrydowe.
