O ile pamiętam, szyfrujesz wiadomość za pomocą klucza publicznego i odszyfrowujesz za pomocą klucza prywatnego. Moje pytanie dotyczy tego, czy można uzyskać klucz publiczny z klucza prywatnego RSA. Na przykład, jeśli mam taki klucz:
-----BEGIN RSA PRIVATE KEY----- MIICXgIBAAKBgQCtrKVnwse4anfX+JzM7imShXZUC+QBXQ11A5bOWwHFkXc4nTfE Or3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j3NgqX8zZJG7IwLJ/Pm2sRW5Q j32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdWtoeLfxDBL2AJ20qXzQIDAQAB AoGBAKNXi0GpmjnCOPDxLFg5bvQVfhLSFCGMKQny1DVEtsfgZmbixv5R2R41T4+d CHJMdEsUFFJ6I7CRLTcg1SDU8IhcAWCBRSNeVuomCHlQG16ti8HxwhiwIcjvDz/z NC2sL5ZJ2eJnhbtXLdf6pxxO1pA5vLp1AX06IaETO977XvupAkEA+ZgtGZybyUkf tEA3ekXc5eLoW+zgU0C1fATWcIZ8Iq5YV1BW+3oAzf8HgIbkQh4LM2qa6An3l+vW NXR4wICHkwJBALIhrcdJqKw36qiyenq+m78klp5SnurQifVt0Sy1GMWyOUqYz5jK t9sGo9Qn6GDuYe/XGXKWQW25PkEYXxxPPx8CQQCpICyvRidp5VrOURVGjUB5pZ+9 am02/In9V2nXJcnH1kuWHqJSFQGmlEEJHl5dTu5YEMyWnupezzd/UUThbDZxAkAz TNO5QxNalbf04YG4e9Bq2eSur+iog2pXzkqhb3404UDypNOUkz0jzOO9o8ieschu xCnGAFPTf7fYE2bAxmnNAkEA0/3bdsvJclquypqP9CQeQnxGwQtWz6+yn07gj3U1 V19mdeKCUZWklRarrcr67u9DdEx+JowyEY/ppzgeQtW01g== -----END RSA PRIVATE KEY-----
Czy mogę otrzymać klucz publiczny?
Komentarze
- Ten klucz wyciekł teraz do internetu i nie jest już bezpieczny do użycia poza przykładami, żebyś zdał sobie z tego sprawę.
- ” Oto klucz do mojego domu. Kto chce wykonać kopię? ”
- Mam nadzieję, że OP wygenerował przykładowy klucz tylko do wykorzystania w tym pytaniu, a następnie natychmiast go pozbył.
- @ basic6 ” Oto klucz do mojego domu. Jak ustawić mi blokadę? ”
- Musisz wyjaśnić, czy ' pytasz o tylko klucz prywatny (w takim przypadku odpowiedź brzmi nie) lub plik klucza prywatnego , który zgodnie z konwencją (jak tutaj) zawiera oba klucze.
Odpowiedź
Czy mogę otrzymać klucz publiczny?
Łatwo jest korzystać z openssl rsa
:
$ openssl rsa -in the-private-key-from-your-question.pem -pubout writing RSA key -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtrKVnwse4anfX+JzM7imShXZU C+QBXQ11A5bOWwHFkXc4nTfEOr3fJjnRSU5A3IROFU/pVVNiXJNkl7qQZK5mYb8j 3NgqX8zZJG7IwLJ/Pm2sRW5Qj32C/uJum64Q/iEIsCg/mJjDLh1lylEMEuzKgTdW toeLfxDBL2AJ20qXzQIDAQAB -----END PUBLIC KEY---
Jeśli chcesz się zorientować, co jest zawarte w pliku klucza, możesz przekazać opcję -text
, aby zobaczyć zrzut debugowania czytelny dla człowieka (w pewnym sensie). W ten sposób możesz zobacz, że plik klucza zawiera zarówno informacje prywatne, jak i informacje publiczne. W szczególności zawiera moduł i publicExponent, które w pełni opisują klucz publiczny:
$ openssl rsa -text -in the-private-key-from-your-question.pem Private-Key: (1024 bit) modulus: 00:ad:ac:a5:67:c2:c7:b8:6a:77:d7:f8:9c:cc:ee: 29:92:85:76:54:0b:e4:01:5d:0d:75:03:96:ce:5b: 01:c5:91:77:38:9d:37:c4:3a:bd:df:26:39:d1:49: 4e:40:dc:84:4e:15:4f:e9:55:53:62:5c:93:64:97: ba:90:64:ae:66:61:bf:23:dc:d8:2a:5f:cc:d9:24: 6e:c8:c0:b2:7f:3e:6d:ac:45:6e:50:8f:7d:82:fe: e2:6e:9b:ae:10:fe:21:08:b0:28:3f:98:98:c3:2e: 1d:65:ca:51:0c:12:ec:ca:81:37:56:b6:87:8b:7f: 10:c1:2f:60:09:db:4a:97:cd publicExponent: 65537 (0x10001) privateExponent: (…)
Komentarze
- @Pysis: ta odpowiedź nie dotyczy ” znajdowanie ” publicznego z klucza publicznego. To proste, że wszystkie informacje potrzebne zarówno do części prywatnej, jak i publicznej są przechowywane w pliku klucza prywatnego. Zamiast tego w pliku klucza publicznego brakuje wszystkich informacji dotyczących części prywatnej.
- @Pysis To jest szyfrowanie asymetryczne .
- @Pysis Tak, szyfrowanie asymetryczne jest ” nieco asymetryczne „.
- @SteffenUllrich To zdanie powinno być częścią Twojej odpowiedzi
- @Mehrdad: w kontekście bezpieczeństwa informacji w świecie rzeczywistym wszystko, co jest praktycznie niewykonalne, jest uważane za niewykonalne. Teoretyczne bezpieczeństwo informacji nie ma tu znaczenia, ponieważ zakłada nieograniczoną moc obliczeniową, której po prostu nie ma. W związku z tym brak wszystkich informacji dotyczących części prywatnej należy odczytywać jako wszystkie informacje umożliwiające w praktyce uzyskanie klucza prywatnego .
Odpowiedź
W praktyce tak, możesz uzyskać klucz publiczny z klucza prywatnego. W zasadzie byłoby możliwe utworzenie klucza prywatnego RSA, z którego nie można łatwo uzyskać odpowiedniego klucza publicznego ale wymagałoby to użycia zarówno niestandardowej metody generowania klucza, jak i niestandardowego formatu przechowywania kluczy prywatnych.
Przejrzyjmy szybko podstawy. Klucz publiczny RSA składa się z dwóch wartości:
- moduł n (iloczyn dwóch potajemnie wybranych dużych liczb pierwszych p i q ), oraz
- publiczny wykładnik e (który może być taki sam dla wielu kluczy i zazwyczaj jest wybierany jako mała nieparzysta liczba pierwsza, najczęściej 3 lub 2 16 +1 = 6 5537).
Tymczasem klucz prywatny RSA wymaga co najmniej następujących dwóch wartości:
- moduł n (to samo co w kluczu publicznym) i
- prywatny wykładnik d (obliczany z publicznego wykładnika e i czynniki p i q modułu).
Jednak większość formatów do przechowywania kluczy prywatnych RSA, w tym PKCS1 format RSAPrivateKey pokazany w pytaniu, w rzeczywistości przechowuje również kilka dodatkowych wartości, w tym:
- publiczny wykładnik e ,
- czynniki p i q modułu,
- zredukowane prywatne wykładniki d p = d mod ( p − 1) i dq = d mod ( q − 1) i
- „ współczynnik CRT ” q inv = q − 1 mod p .
W szczególności włączenie publicznego wykładnika e w formacie klucza prywatnego oznacza, że klucz publiczny można trywialnie wyodrębnić z pliku klucza prywatnego zgodnego z PKCS1.Ponadto, nawet jeśli publiczny wykładnik e nie został uwzględniony w pliku klucza prywatnego, znajomość współczynników p i q modułu pozwala każdemu wykładnikowi łatwe do obliczenia na podstawie innych. I wreszcie, nawet gdybyśmy nie znali współczynników modułu, dla kluczy RSA generowanych w zwykły sposób moglibyśmy po prostu przetestować najczęściej używane wartości e i zobaczyć, który z nich generuje zaszyfrowane teksty, które można poprawnie odszyfrować przy użyciu podanego klucza prywatnego.
Wszystko to powiedziane, gdybyśmy mieli użyć niestandardowego algorytmu generowania klucza RSA, który wybrałby e ( lub d ) losowo z dopuszczalnego zakresu wartości (tj. liczb całkowitych większych niż 1 i mniejszych niż i względnie pierwszych z λ ( n ) = lcm ( p − 1, q − 1)), a jeśli użyjemy niestandardowego formatu klucza prywatnego RSA, który przechowuje jedynie minimum informacji do odszyfrowania (tj. n i d ), wtedy nie byłoby możliwe obliczenie klucza publicznego z klucza prywatnego bez skutecznego złamania klucza (tj. uwzględnienia modułu).
Rzeczywiście, gdyby został użyty w tak niestandardowym człowieku W istocie algorytm RSA staje się „symetryczny” w tym sensie, że żaden z kluczy ( n , e ) i ( n , d ) można skutecznie obliczyć na podstawie drugiego, a każdy z nich może zostać arbitralnie wyznaczony jako klucz prywatny. W zasadzie, jeśli nie pozwolisz posiadaczowi klucza prywatnego poznać odpowiedniego klucza „publicznego” (co oczywiście oznacza, że tak naprawdę nie byłby już publiczny), wówczas mogliby tylko odszyfrować wiadomości, ale ich nie szyfrować. Niestety, praktyczna użyteczność każdego takiego schematu jest raczej ograniczona prostym faktem, że ktokolwiek generuje parę kluczy, i tak nieuchronnie pozna obie jej części.
Komentarze
- Krzywię się z powodu ostatniego zdania. Ponieważ e i tak jest uważane za publiczne, nie zapominając o e (i p i q) trudno uznać za tylne drzwi dostępne dla właściciela klucza prywatnego. (A jeśli przeciwnik uzyska klucz prywatny d, ma również klucz publiczny e i wygrał)
- @HagenvonEitzen: Ostatni akapit mówi o (niestandardowym) przypadku użycia, w którym e nie jest ani publiczne, ani małe .
- @HagenvonEitzen: Rzeczywiście, wspomniałem o tym problemie w poście z linkami do crypto.SE. Każdy schemat, który opiera się na ” publicznym ” kluczu, którego nie można wyprowadzić z ” prywatnego ” klucz musi koniecznie zachowywać ” publiczny ” klucz przed przynajmniej niektórymi stronami ( i tym samym naruszają jedno ze standardowych założeń kryptowalut z kluczem publicznym), aby ta funkcja była użyteczna. Ale widzę, jak ten akapit mógł wprowadzać w błąd; miejmy nadzieję, że przepisana wersja jest przynajmniej trochę jaśniejsza.
- RSA ma interesującą matematyczną właściwość, że odszyfrowanie używa tego samego wzoru co szyfrowanie, tylko z
d
zamiaste
. Dzięki temu możesz zamieniće
id
(czyli użyć klucza prywatnego do szyfrowania i publicznego do odszyfrowania). Wtedy otrzymasz schemat podpisu elektronicznego.
Odpowiedź
Tak. To też jest całkiem proste. Jeśli spojrzysz na specyfikację RSA, klucz publiczny wymaga n
i e
. Klucz prywatny może mieć p
q
d
. Użyj tych do obliczeń.
n=p*q e=mod_inverse(d,euler_totient(n))
Jeśli chcesz spakować je do formatu PEM z powrotem, zobacz https://github.com/ius/rsatool
Komentarze
- Ujęte jako odpowiedź matematyczna, to jest błędne. Klucz prywatny może mieć tylko n i d, a z tego powodu niemożliwe generalnie do obliczenia e. To ' jest zwykle możliwe w praktyce tylko dlatego, że e jest prawie zawsze wybierane spośród kilku wartości. Ujęte jako praktyczna odpowiedź, jest to błędne: e to, w praktyce zawsze dołączane do innych parametrów (przynajmniej n i d, zwykle również parametry potrzebne do obliczeń opartych na CRT).
- Zgoda, ale praktycznie RSA z kluczami prywatnymi CRT są zwykle przechowywane jako krotka (n, e, d, p, q, dP, dQ, qInv), co ma miejsce w tym przypadku. Już próbowałem ustawić składniki matematycznie.
- Tak: praktycznie klucze prywatne są zwykle przechowywane jako krotka zawierająca e . Nie ma potrzeby obliczania e.
- @Gilles Z postu: ” klucz publiczny wymaga
n
ie
.” i od sudhackar ' komentarz: ” ale praktycznie RSA z kluczami prywatnymi CRT to zwykle przechowywana jako krotka (n, e, d, p, q, dP, dQ, qlnv) „, co prowadzi mnie do wniosku, że praktycznie klucze prywatne są zwykle przechowywane jako krotka zawierająca klucz prywatny . Nie ma potrzeby obliczania klucza prywatnego, dzięki czemu całe pytanie i wszystkie odpowiedzi na nie są nieistotne. Nie ' nie rozumiem Twojego ostatniego komentarza. Odpowiedź sudhackar ' pokazuje, jak znaleźć zestaw możliwych kluczy publicznych na podstawie najmniej użytecznych informacji. - @ wizzwizz4 Jeśli masz p, q i d , masz więcej niż najmniej przydatne informacje dotyczące klucza prywatnego. ' nigdy nie widziałem kluczy prywatnych z p, q id, ale nie n i e. Potrzebujesz n, aby zrobić cokolwiek pożytecznego z kluczem, a przechowywanie p i q zamiast n nie ' nie zyskuje żadnego miejsca.