2008-09-17 7 views
4

OK - Mike 덕분에 Wincrypt에서 Diffie-Hellman 키 쌍을 생성 할 수있었습니다. 공개 키를 내보내는 방법과 상대방의 공개 키를 가져 오는 방법을 알아 냈습니다. 문서에 따르면 상대방의 공개 키를 가져 오면 공유 된 비밀이 계산됩니다. 큰.Diffie-Hellman 용 Wincrypt를 사용하고 있습니다. 공유 암호를 일반 텍스트로 내보낼 수 있습니까?

이제는 그 공유 된 비밀을 알아야하지만, 나는 가능하다고 생각하지 않습니다. CryptSetKeyParam을 호출하여 알고리즘 ID를 CALG_AGREEDKEY_ANY에서 다른 것으로 변경하지 않는 한 CryptExportKeyPLAINTEXTKEYBLOB으로 호출하면 오류가 발생합니다. 그러나 나는 을 원한다. 다른 것을 원한다. 나는 공유 된 비밀을 원한다. 그러나 API는이를 방지하기 위해 설계된 것 같습니다.

어떤 아이디어가 있습니까? 여기서 문제는 WiFi Protected Setup 구현의 한 면만 쓰고 있다는 점입니다. 그래서 프로토콜은 나를 위해 정의되었고, 상대방은 나에게 HCRYPTKEY를주지 않습니다. 에서

+0

이 문제가 해결 되었습니까? 비슷한 문제로 ... – Julio

답변

2

이것은 당신이 필요 같습니다 ... : http://msdn.microsoft.com/en-us/library/aa381969(VS.85).aspx


CryptAcquireContext 기능

  1. 전화 키 비밀 세션을 Diffie-Hellman 공개 키를 가져 와서 계산하기 Microsoft Diffie-Hellman Cryptographic Provider에 대한 핸들을 얻으십시오.
  2. CryptGenKey 함수를 호출하여 새 키를 만들거나 CryptGetUserKey 함수를 호출하여 기존 키를 검색하여 Diffie-Hellman 키를 만듭니다.
  3. Diffie-Hellman 공개 키를 CSP로 가져 오려면 매개 변수의 공개 키 BLOB, dwDataLen 매개 변수의 BLOB 길이 및 Diffie-Hellman 공개 키에 대한 핸들을 포인터로 전달하여 CryptImportKey 함수를 호출하십시오. hPubKey 매개 변수의 Hellman 키 이로 인해 계산 (Y^X) mod P이 수행되어 공유 비밀 키가 작성되고 키 교환이 완료됩니다. 이 함수 호출은 hKey 매개 변수에있는 새 세션 키의 핸들을 반환합니다.
  4. 이 시점에서 가져온 Diffie-Hellman은 CALG_AGREEDKEY_ANY입니다. 키를 사용하려면 먼저 세션 키 유형으로 변환해야합니다. 이것은 dwParamKP_ALGID으로 설정되고 pbDataCALG_RC4과 같은 세션 키를 나타내는 ALG_ID 값의 포인터로 설정된 CryptSetKeyParam 함수를 호출하여 수행됩니다. 키는 CryptEncrypt 또는 CryptDecrypt 함수에서 공유 키를 사용하기 전에 변환되어야합니다. 키 유형을 변환하기 전에이 함수 중 하나를 호출하면 실패합니다.
  5. 이제 보안 세션 키를 암호화 또는 암호 해독에 사용할 준비가되었습니다.
  6. 키가 더 이상 필요하지 않으면 CryptDestroyKey 함수를 호출하여 키 핸들을 파괴하십시오.
+0

+1 @ 리차드, 깔끔한 설명. 귀하의 제안은 주요 계약 계획을 해결할 것입니다.하지만 DH를 사용하는 주요 전송에 관심이 있다면 어떻게 PKI를 위해이 작업을 수행 할 수 있습니까? – Raj