Jak szyfrować wiadomości / tekst za pomocą RSA i OpenSSL?

29

Mam klucz publiczny Alice. Chcę wysłać Alice zaszyfrowaną wiadomość RSA. Jak mogę to zrobić za pomocą opensslpolecenia?

Wiadomość jest:

Cześć Alice! Proszę przynieść malacpörkölt na obiad!

LanceBaynes
źródło

Odpowiedzi:

36

W podręczniku openssl ( opensslstrona podręcznika użytkownika ) wyszukaj RSA, a zobaczysz, że polecenie szyfrowania RSA to rsautl. Następnie przeczytaj rsautlstronę podręcznika, aby zobaczyć jego składnię.

echo 'Hi Alice! Please bring malacpörkölt for dinner!' |
openssl rsautl -encrypt -pubin -inkey alice.pub >message.encrypted

Domyślnym schematem dopełniania jest oryginalny PKCS # 1 v1.5 (nadal używany w wielu procotolach); openssl obsługuje także OAEP (teraz zalecane) i surowe szyfrowanie (przydatne tylko w szczególnych okolicznościach).

Zauważ, że używanie openssl bezpośrednio jest głównie ćwiczeniem. W praktyce używałbyś narzędzia takiego jak gpg (który wykorzystuje RSA, ale nie bezpośrednio do szyfrowania wiadomości).

Gilles „SO- przestań być zły”
źródło
Na czym polega problem z używaniem openssl?
Bratchley,
2
@Bratchley opensslNarzędzie wiersza poleceń to połączenie różnych poleceń. Niektóre, głównie te, które manipulują certyfikatami, mogą być przydatne, ale są trudne w użyciu, ponieważ ich składnia i parametry są dziwaczne. Niektóre, na przykład rsautl, są w porządku, ale nie zapewniają użytecznej funkcjonalności, po prostu ujawniają surowe pierwotne elementy kryptograficzne - na przykład szyfrowanie RSA jest używane tylko do szyfrowania klucza symetrycznego do szyfrowania hybrydowego. Niektóre z nich encsą bardzo trudne w bezpiecznym użytkowaniu, a światu byłoby lepiej, gdyby nie istniały.
Gilles „SO- przestań być zły”
Świetna odpowiedź. Dodałem padding z tą flagą -oaep Następnie przy odszyfrowywaniu określ to samo ... openssl rsautl -decrypt -in message.encrypted -inkey private_key.pem -oaep
rustyMagnet
24

Po pierwsze, jeśli chcesz po prostu dobrego szyfrowania, powinieneś spojrzeć na GnuPG . Ale jeśli eksperymentujesz i chcesz się dowiedzieć, jak to działa, musisz zrozumieć, czym jest RSA . RSA nie jest zaprojektowany do szyfrowania dowolnego dowolnego ciągu, jest to algorytm szyfrujący liczbę całkowitą. W szczególności liczba całkowita od 0 do n-1, gdzie n jest wartością modułu z klucza publicznego. Kiedy mówimy o kluczu RSA, który ma 1024 bity, oznacza to, że potrzeba 1024 bitów, aby zapisać moduł w formacie binarnym. Jest to jeden z powodów, dla których RSA jest używany w połączeniu z symetrycznym kluczem szyfrowym, takim jak DES lub AES. Możesz wygenerować losowy 256-bitowy klucz dla AES i zaszyfrować go 1024-bitowym kluczem publicznym RSA. Następnie każdy, kto ma dostęp do klucza prywatnego, może wyodrębnić klucz symetryczny i zdekodować wiadomość za pomocą AES. Pełny standard RSA nazywa się PKCS # 1

Ponadto DES i AES są szyframi blokowymi. Szyfrują tylko dane w bloku o określonym rozmiarze. DES używa 64-bitowych bloków, a AES 128-bitowych. Aby zaszyfrować więcej niż blok, musisz użyć trybu działania, takiego jak CBC lub CTR. Tryby te określają sposób szyfrowania strumienia bitów za pomocą szyfru w trybie blokowym.

Wreszcie ważne jest zweryfikowanie otrzymywanych danych. Chociaż osoba atakująca może nie być w stanie odczytać danych w tranzycie, może być w stanie przerzucić bity bez wykrywania, jeśli do strumienia danych nie zostanie zastosowana integralność ani autentyczność. Osoba atakująca może łatwo zgadnąć, że połączenie SSL z portem 443 jest prawdopodobnie żądaniem strony internetowej zaczynającym się od, GET /i może zmienić bit, zmieniając je na, PUT /bez ingerowania w resztę szyfrowania. Prostym podejściem do integralności jest dodanie na końcu sumy MD5 lub SHA-1, ale zapewnia to tylko integralność danych, a nie autentyczność danych. Każdy, kto ma pełną wiedzę na temat strumienia danych, może wygenerować poprawną sumę, bezpieczniejszym podejściem jest użycie skrótu kluczowego, takiego jak HMAC który wymaga znajomości tajnego klucza do wygenerowania, zapewniając w ten sposób oprócz integralności autentyczność danych.

penguin359
źródło
2
To jest naprawdę dobre
mko
5

Poniżej zaznacz, że możesz podać dowolny algorytm, czy to na liście, czy na RSA (chociaż nie znam dokładnej nazwy używanej dla RSA przez OpenSSL)

użyj „openssl enc -help”, aby uzyskać listę obsługiwanych szyfrów w systemie i przekazać ją jako argument. np. „-aes256”

Uwaga w moim systemie Nie mam RSA w moich opcjach - przynajmniej pod tą nazwą.


Jak szyfrować wiadomość S / MIME?

Powiedzmy, że ktoś wysyła ci jej certyfikat publiczny i prosi o zaszyfrowanie jej wiadomości. Zapisałeś jej certyfikat jako her-cert.pem. Zapisałeś swoją odpowiedź jako my-message.txt.

Aby uzyskać domyślne - choć dość słabe - szyfrowanie RC2-40, po prostu powiedz openssl, gdzie znajduje się wiadomość i certyfikat.

openssl smime her-cert.pem -encrypt -in my-message.txt

Jeśli masz pewność, że Twój zdalny korespondent ma solidny zestaw narzędzi SSL, możesz określić silniejszy algorytm szyfrowania, taki jak potrójne DES:

openssl smime her-cert.pem -encrypt -des3 -in my-message.txt

Domyślnie zaszyfrowana wiadomość, w tym nagłówki wiadomości, jest wysyłana na standardowe wyjście. Użyj opcji -out lub powłoki, aby przekierować go do pliku. Lub, znacznie trudniejsze, przesłać dane bezpośrednio do sendmaila.

openssl smime her-cert.pem \
   -encrypt \
   -des3 \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My encrypted reply' |\
 sendmail [email protected]

Jak podpisać wiadomość S / MIME?

Jeśli nie musisz szyfrować całej wiadomości, ale chcesz ją podpisać, aby zapewnić odbiorcy integralność wiadomości, przepis jest podobny do szyfrowania. Główną różnicą jest to, że musisz mieć własny klucz i certyfikat, ponieważ nic nie możesz podpisać certyfikatem odbiorcy.

 openssl smime \
   -sign \
   -signer /path/to/your-cert.pem \
   -in my-message.txt \
   -from 'Your Fullname <[email protected]>' \
   -to 'Her Fullname <[email protected]>' \
   -subject 'My signed reply' |\
 sendmail [email protected]

(od http://www.madboa.com/geek/openssl/ )

(Ee ... wszystkie te ukośniki odwrotne - te mają być znakami nowej linii. Nie jestem pewien, co się dzieje, ponieważ wyświetla się dobrze w moim polu edycji!

draeath
źródło
1
Musisz umieścić cztery spacje na początku każdej linii, aby zachować nowe linie. Zmieniłem pierwszy blok, aby pokazać Ci, jak to zrobić. Czy możesz naprawić drugi?
Mikel
1
Nie znaleziono RSA, openssl encponieważ encsłuży wyłącznie do szyfrowania symetrycznego. Tak, opcje openssl nie są zbyt dobrze zorganizowane. Algorytmy asymetryczne mają swoje własne polecenia: rsa/ dsa/ dhdo manipulowania kluczami, rsautl/ dsautldo szyfrowania / deszyfrowania / weryfikacji / podpisywania i genrsa/ gendsa/ gendhdo generowania kluczy.
Gilles 'SO - przestań być zły'