2008-09-16 3 views
0

은 MSDN 문서 here있다,하지만 난 아주 멀리받지 못했습니다 :P & G - Diffie-Hellman 키 쌍을 생성하는 데 Wincrypt API를 어떻게 사용합니까?

p = 139; 
g = 5; 

CRYPT_DATA_BLOB pblob; 
pblob.cbData = sizeof(ULONG); 
pblob.pbData = (LPBYTE) &p; 

CRYPT_DATA_BLOB gblob; 
gblob.cbData = sizeof(ULONG); 
gblob.pbData = (LPBYTE) &g; 

HCRYPTKEY hKey; 
if (::CryptGenKey(m_hCryptoProvider, CALG_DH_SF, 
        CRYPT_PREGEN, &hKey)) 
{ 
    ::CryptSetKeyParam(hKey, KP_P, (LPBYTE) &pblob, 0); 

NTE_BAD_DATA 여기 실패. 나는 MS_DEF_DSS_DH_PROV을 사용하고 있습니다. 뭐라 구요?

답변

2

사용중인 매우 짧은 키가 마음에 들지 않을 수도 있습니다.

전체 예제가 있으므로 the desktop version of that article이 도움이 될 수 있습니다.

편집 :

사용하려는 비트 수에 플래그의 상위 16 비트를 설정하여 할 당신이 키가 얼마나 CryptGenKey 말할 필요 예, 실현 영업을 . 이것을 0으로두면 기본 키 길이가됩니다. 이 비고 섹션에 장치 설명서의이고 desktop documentation에는 dwFlags 매개 변수가 설명되어 있습니다.

Diffie-Hellman 키 교환 알고리즘의 경우 Windows XP 이상에서는 기본 공급자의 기본값은 512 비트이고 확장 공급자 (기본값)의 기본값은 1024 비트 키입니다. CE의 기본 길이에 ​​대한 문서가없는 것 같습니다.

BYTE p[64] = { 139 }; // little-endian, all other bytes set to 0 
BYTE g[64] = { 5 }; 

CRYPT_DATA_BLOB pblob; 
pblob.cbData = sizeof(p); 
pblob.pbData = p; 

CRYPT_DATA_BLOB gblob; 
gblob.cbData = sizeof(g); 
gblob.pbData = g; 

HCRYPTKEY hKey; 
if (::CryptGenKey(m_hCryptoProvider, CALG_DH_SF, 
        (512 << 16) | CRYPT_PREGEN, &hKey)) 
{ 
    ::CryptSetKeyParam(hKey, KP_P, (LPBYTE) &pblob, 0); 
+0

고마워요, 마이크 - 나는 당신의 레퍼런스에서 2 가지 *라는 것을 발견했습니다. CryptGenKey에게 길이를 16 비트 씩 비트 단위로 or'ing하여 플래그 매개 변수에 알려 주어야합니다 (물론 문서화되지 않았습니다. 샘플을 읽어야합니다). * 또한 *, 키 길이는 적어도 512 비트 여야합니다. –

1

KP_P, KP_G, KP_Q은 DSS 키 (Digital Signature Standard?) 용입니다. Diffie-Hellman의 경우 KP_PUB_PARAMS을 사용하고 DHPUBKEY_VER3 구조를 가리키는 DATA_BLOB을 전달한 것으로 보입니다.

가리키는 문서는 Windows Mobile/Windows CE SDK에서 가져온 것입니다. CE가 데스크톱/서버와 다르게 작동 한 것은 처음이 아닙니다.

EDIT : CE는 KP_PUB_PARAMS을 구현하지 않습니다. 바탕 화면에서이 구조를 사용하려면 Diffie-Hellman Version 3 Public Key BLOBs을 참조하십시오.

+0

감사합니다,하지만 DHPUBKEY_VER3 구조는 하나의 P & G (그들의 비트가 거리에서는 쉴드) 지정할 수 있도록 표시되지 않습니다 :

코드는 따라서해야한다. 또한 필자는 데스크톱이 아닌 Windows Mobile에 대해 언급해야합니다. OpenSSL 포트를 찾을 수 있을지 궁금합니다. ;) –

관련 문제