2013-08-09 8 views
15

Używam biblioteki c biblioteki OpenSSL do wygenerowania pary kluczy Diffie-Hellman (ECDH) z krzywą eliptyczną, po pierwszym kodzie kodowym here. To pomija rzeczywistej wymiany kluczy publicznych z tej linii:W jaki sposób uzyskuje się dostęp do surowego klucza publicznego ECDH, klucza prywatnego i parametrów wewnątrz struktury EVP_PKEY OpenSSL?

peerkey = get_peerkey(pkey); 

pkey zmienna i wartość zwracana są zarówno typu EVP *. pkey zawiera klucz publiczny, klucz prywatny i wygenerowane wcześniej parametry, a wartość zwracana zawiera tylko klucz publiczny peera. Więc to podnosi trzy pytania:

  1. Jak get_peerkey() faktycznie wyodrębnić tylko klucz publiczny z pkey wysyłania do uczestnika?
  2. W jaki sposób kod wyodrębniłby klucz prywatny i parametry z pKey, aby zapisać je do późniejszego wykorzystania po wymianie kluczy?
  3. W jaki sposób get_peerkey() wygeneruje nową strukturę EVP_PKEY z surowego klucza publicznego równorzędnego?

Widziałem funkcje OpenSSL EVP_PKEY_print_public(), EVP_PKEY_print_private() i EVP_PKEY_print_params() ale są do generowania wyjścia postaci czytelnej dla człowieka. I nie znalazłem żadnego odpowiednika do konwersji klucza publicznego czytelnego dla człowieka z powrotem do struktury EVP_PKEY.

Odpowiedz

32

Aby odpowiedzieć na własne pytanie, istnieje inna ścieżka dla klucza prywatnego i klucza publicznego.

do serializacji klucza publicznego:

  1. Przepuścić EVP_PKEY do EVP_PKEY_get1_EC_KEY(), aby uzyskać EC_KEY.
  2. Przekaż EC_KEY do EC_KEY_get0_public_key(), aby otrzymać EC_POINT.
  3. Przekaż EC_POINT do EC_POINT_point2oct(), aby uzyskać oktety, które są po prostu znakiem uns *.

deserializacji klucza publicznego:

  1. Przepuścić oktety do EC_POINT_oct2point(), aby uzyskać EC_POINT.
  2. Przekaż EC_POINT do EC_KEY_set_public_key(), aby uzyskać EC_KEY.
  3. Przekaż EC_KEY do EVP_PKEY_set1_EC_KEY, aby otrzymać EVP_KEY.

do serializacji klucz prywatny:

  1. Przepuścić EVP_PKEY do EVP_PKEY_get1_EC_KEY(), aby uzyskać EC_KEY.
  2. Przekaż EC_KEY do EC_KEY_get0_private_key(), aby uzyskać BIGNUM.
  3. Przekaż BIGNUM do BN_bn2mpi(), aby uzyskać mpi, czyli format napisany na niepodpisany znak *.

deserializacji klucz prywatny:

  1. Pass MPI do BN_mpi2bn(), aby uzyskać BIGNUM.
  2. Przekaż BIGNUM do EC_KEY_set_private_key(), aby uzyskać EC_KEY.
  3. Przekaż EC_KEY do EVP_PKEY_set1_EC_KEY, aby otrzymać EVP_KEY.

Możliwe jest również przekonwertowanie BIGNUM na hex, dziesiętny lub "bin", chociaż myślę, że mpi użyło najmniej bajtów.

+2

Dziękujemy za udzielenie odpowiedzi! – samoz

+0

Odserializowanie klucza publicznego mogło działać 4 lata i 5 miesięcy temu, ale dziś brzmi to dość skomplikowanie !!! : p EVP_PKEY_get1_EC_KEY ma stworzyć EC_POINT z oktetu, ale dostaje EC_POINT * od wejścia! Próbowałem zrobić to przez EC_POINT_new, ale później nie mogłem stworzyć tajnego klucza przy pomocy EVP_KEY! – madz

Powiązane problemy