2013-08-09 10 views
15

OpenSSL의 c 라이브러리를 사용하여 첫 번째 코드 샘플 here 다음에 타원 곡선 Diffie-Hellman (ECDH) 키 쌍을 생성합니다. 그것은이 라인 공개 키의 실제 교환 얼버무 :OpenSSL의 EVP_PKEY 구조 내에서 원시 ECDH 공개 키, 개인 키 및 매개 변수에 어떻게 액세스합니까?

peerkey = get_peerkey(pkey); 

pkey 변수와 반환 값 유형 EVP *의 등록 상표입니다. pkey에는 이전에 생성 된 공개 키, 개인 키 및 params가 들어 있으며 반환 값에는 피어의 공개 키만 포함됩니다.

  1. 방법 get_peerkey() 실제로 피어에 보내는 pkey에서 불과 공개 키를 추출하는 것입니다 : 그래서이 세 가지 질문을 제기?
  2. 코드에서 키 교환 후 개인 키와 매개 변수를 나중에 사용하기 위해 저장하기 위해 pKey에서 어떻게 추출합니까?
  3. get_peerkey()은 피어의 원시 공개 키에서 새로운 EVP_PKEY 구조를 어떻게 생성합니까?

난에는 OpenSSL 기능 EVP_PKEY_print_public(), EVP_PKEY_print_private()EVP_PKEY_print_params()을 본 적이 있지만, 이들은 사람이 읽을 수있는 출력을 생성합니다. 그리고 사람이 읽을 수있는 공개 키를 다시 EVP_PKEY 구조로 변환하는 것과 동일한 것을 발견하지 못했습니다.

답변

32

내 질문에 대답하기 위해 개인 키와 공개 키의 경로가 다릅니다.

는 공개 키를 직렬화하려면
  1. 는 EC_KEY를 얻을 수 EVP_PKEY_get1_EC_KEY()에 EVP_PKEY를 전달합니다.
  2. EC_KEY_get0_public_key()에 EC_KEY를 전달하여 EC_POINT를 가져옵니다.
  3. EC_POINT를 EC_POINT_point2oct()에 전달하여 8 진수 (unsigned char *)를 가져옵니다.

는 공개 키를 역 직렬화하려면

  1. 는 EC_POINT를 얻을 수 EC_POINT_oct2point()에 옥텟을 전달합니다.
  2. EC_KEY_set_public_key()에 EC_POINT를 전달하여 EC_KEY를 가져옵니다.
  3. EC_KEY를 EVP_PKEY_set1_EC_KEY에 전달하여 EVP_KEY를 가져옵니다.

는 개인 키를 직렬화하려면

  1. 는 EC_KEY를 얻을 수 EVP_PKEY_get1_EC_KEY()에 EVP_PKEY를 전달합니다.
  2. EC_KEY를 EC_KEY_get0_private_key()에 전달하여 BIGNUM을 가져옵니다.
  3. BIGN을 BN_bn2mpi()에 전달하여 mpi를 얻습니다. 형식은 unsigned char *로 작성됩니다.
    1. 가의 bignum를 얻을 수 BN_mpi2bn에 MPI()를 전달합니다

  4. 는 개인 키를 역 직렬화합니다.
  5. BIGNUM을 EC_KEY_set_private_key()에 전달하여 EC_KEY를 가져옵니다.
  6. EC_KEY를 EVP_PKEY_set1_EC_KEY에 전달하여 EVP_KEY를 가져옵니다. 내가 MPI가 가장 적은 바이트를 사용한다고 생각하지만

이, 진수, 진수, 또는 "빈"에의 bignum로 변환 할 수있다.

+2

후속 답변을 제공해 주셔서 감사합니다. – samoz

+0

공개 키를 비 직렬화하는 것은 4 년 5 개월 전일지도 모르지만 오늘은 상당히 복잡하게 들립니다 !!! : p EVP_PKEY_get1_EC_KEY는 옥텟으로부터 EC_POINT를 생성하기로되어 있지만 입력으로부터 EC_POINT *를 얻습니다! 나는 EC_POINT_new에 의해 그것을 만들려고했으나 나중에 EVP_KEY를 생성하는 비밀 키를 만들 수 없었다! – madz