2016-06-30 16 views
2

암호화 된 차세대 API (CNG)를 사용하여 ECDHE를 구현하고 있습니다. 공개 키와 개인 키를 성공적으로 생성합니다. 사전 공유 키의 경우 BCryptSecretAgreement API를 사용하여 사전 공유 키 비밀 처리 (BCRYPT_SECRET_HANDLE)을 반환합니다.BYTE 배열로 공유 암호를 BCRYPT_SECRET_HANDLE에서 내 보냅니다.

BCRYPT_SECRET_HANDLE에서 사전 공유 키를 BYTE 배열로 내보내려면 어떻게해야합니까?

답변

0

BCRYPT_SECRET_HANDLE을 받으면 BCryptDeriveKey을 사용하여 실제 대칭 암호화 키를 얻습니다.

+0

이것은 실제로 원래 질문에 대답하지 않습니다. 이것이하지 않는 것은 실제로 공유 키를 추출하는 것입니다. 공유 된 비밀에서 무언가를 도출하지만 실제 공유 키 자체를 얻을 수있는 방법이없는 것처럼 보입니다. –

-1

BCryptSecretAgreement을 호출 한 후 BCryptDeriveKey 함수를 사용하여 공유 암호를 검색해야합니다. 다음

이 수행 될 수있다 : 두 번째 매개 변수의

// generates an ECDH shared secret from a public key and a private key 
int get_ECDH_key(BCRYPT_KEY_HANDLE pubkey, BCRYPT_KEY_HANDLE privkey, unsigned char **key, 
       unsigned int *keylen) 
{ 
    SECURITY_STATUS sstatus; 
    BCRYPT_SECRET_HANDLE secret; 
    int _len; 

    // creates the shared secret, stored in a BCRYPT_SECRET_HANDLE 
    sstatus = BCryptSecretAgreement(privkey, pubkey, &secret, 0); 
    if (!BCRYPT_SUCCESS(sstatus)) { 
     printf("BCryptSecretAgreement failed with status %d", sstatus); 
     return 0; 
    } 

    // find out how much space is needed before retrieving the shared secret 
    sstatus = BCryptDeriveKey(secret, BCRYPT_KDF_HASH, NULL, NULL, 0, &_len, 0); 
    if (!BCRYPT_SUCCESS(sstatus)) { 
     printf("BCryptDeriveKey failed with status %d", sstatus); 
     return 0; 
    } 

    // allocate space for the shared secret 
    *key = malloc(_len); 
    if (*key == NULL) { 
     perror("malloc failed"); 
     exit(1); 
    } 

    // retrieve the shared secret 
    sstatus = BCryptDeriveKey(secret, BCRYPT_KDF_HASH, NULL, *key, _len, 
           keylen, 0); 
    if (!BCRYPT_SUCCESS(sstatus)) { 
     printf("BCryptDeriveKey failed with status %d", sstatus); 
     return 0; 
    } 
    return 1; 
} 

을 일정한 BCRYPT_KDF_HASH 키 유도 함수로서 해시를 사용했다. 사용할 해시를 세 번째 매개 변수로 지정할 수 있습니다. 이 예제에서 세 번째 매개 변수는 NULL이므로 기본적으로 SHA1을 사용합니다.

또한 네 번째 매개 변수는 키를 수신 할 버퍼에 대한 포인터로 NULL 일 수 있습니다. 그렇다면 키는 복사되지 않지만 복사 될 바이트 수는 여섯 번째 매개 변수에 의해 지정된 주소에 기록됩니다. 이렇게하면 할당 된 버퍼의 주소를 전달하면서 적절한 양의 공간을 할당 한 다음 함수를 다시 호출 할 수 있습니다.

+0

이것은 실제로 원래 질문에 응답하지 않습니다. 이것이하지 않는 것은 실제로 공유 키를 추출하는 것입니다. 공유 된 비밀에서 무언가를 도출하지만 실제 공유 키 자체를 얻을 수있는 방법이없는 것처럼 보입니다. –

+0

@TomQuarendon이 코드는 실제로 공유 된 비밀을 검색합니다. 'BCryptDeriveKey'에 대한 두 번째 호출 후에 공유 키를 나타내는'* key'에'* keylen' 바이트가 있습니다. 교환기의 양측은 자신의 개인 키와 타사의 공개 키를 사용하여 동일한 가치를 갖습니다. – dbush

+0

* a * 공유 키를 얻습니다. 그렇습니다. 예를 들어 Diffie Hellman의 경우에는 수행하지 않는 것은 "g ** xy mod p"에 대한 답을 제공하는 것입니다. 아무리 prepend와 append도 제공하지 않으면, 그 값의 SHA1 해쉬를 제공한다. 예를 들어 SSH와 같은 사양에 따라 DH의 Java 구현과 호환되는 무언가를 작성하려는 경우 운이 없다. "널 (null)"키 유도 함수를 지정할 수 없으면 지금까지는 실패했습니다. –