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 일 수 있습니다. 그렇다면 키는 복사되지 않지만 복사 될 바이트 수는 여섯 번째 매개 변수에 의해 지정된 주소에 기록됩니다. 이렇게하면 할당 된 버퍼의 주소를 전달하면서 적절한 양의 공간을 할당 한 다음 함수를 다시 호출 할 수 있습니다.
이것은 실제로 원래 질문에 대답하지 않습니다. 이것이하지 않는 것은 실제로 공유 키를 추출하는 것입니다. 공유 된 비밀에서 무언가를 도출하지만 실제 공유 키 자체를 얻을 수있는 방법이없는 것처럼 보입니다. –