Szyfrowanie asymetryczne komunikatów

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.txt

Wybó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-algorithms

co 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:2048

Eksportowanie klucza publicznego

Mając klucz prywatny, możemy z niego wyeksportować klucz publiczny:

openssl rsa -pubout -in private_key.pem -out public_key.pem

Szyfrowanie 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.enc

Odszyfrowywanie 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.

Pozostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *