2017-02-05 8 views
0

Ich habe dieses Tutorial für SSL/TLS online verfolgt (naja, es ist mehr davon, den Quellcode der Jungs zu lesen und zu folgen), aber ich bin mit diesem EncryptMessage-Teil ziemlich holprig es schiebt die Daten aus dem Weg und verschlüsselt die falschen Informationen.C++ - EncryptMessage verschlüsselt nicht die richtigen Daten

Die pbloBuffer, dass ich es senden ist:

GET/HTTP/1.1\r\n 
HOST: www.google.com\r\n\r\n 

Aber wenn ich pbMessage = pbloBuffer + Sizes.cbHeader; Ich am Ende mit (auch der Microsoft-Website sagt, dies zu tun)

1\r\n 
HOST: www.google.com\r\n\r\n 

Jetzt pbMessage der obige Code ist, und das ist unter SECBUFFER_DATA eingesetzt, so ist es nicht einmal die vollen Daten zu bekommen. Soweit ich weiß, sind SECBUFFER_DATA die "Benutzer" -Daten, die der Webserver entschlüsseln und verarbeiten wird.

Können Sie herausfinden, wie Sie dies beheben und die verschlüsselten Daten ordnungsgemäß senden?

Voll Quelle: (Dieser Code ist experimentell, wie ich es verstehe ich versucht, bevor ich Änderungen vornimmt)

int Adaptify::EncryptSend(PBYTE pbloBuffer, int Size) { 

    SECURITY_STATUS scRet{ 0 }; 
    SecBufferDesc  Message{ 0 }; 
    SecBuffer   Buffers[4]{ 0 }; 
    DWORD    cbMessage = 0, cbData = 0; 
    PBYTE    pbMessage = nullptr; 
    SecPkgContext_StreamSizes Sizes = { 0 }; 
    QueryContextAttributesW(&hContext, SECPKG_ATTR_STREAM_SIZES, &Sizes); 

    pbMessage = pbloBuffer + Sizes.cbHeader; 
    cbMessage = (DWORD)strlen((const char*)pbMessage); 

    Buffers[0].BufferType = SECBUFFER_STREAM_HEADER; 
    Buffers[0].cbBuffer = Sizes.cbHeader; 
    Buffers[0].pvBuffer = pbloBuffer; 

    Buffers[1].BufferType = SECBUFFER_DATA; 
    Buffers[1].pvBuffer = pbMessage; 
    Buffers[1].cbBuffer = cbMessage; 

    Buffers[2].BufferType = SECBUFFER_STREAM_TRAILER; 
    Buffers[2].cbBuffer = Sizes.cbTrailer; 
    Buffers[2].pvBuffer = pbMessage + cbMessage; 

    Buffers[3].BufferType = SECBUFFER_EMPTY; 
    Buffers[3].cbBuffer = SECBUFFER_EMPTY; 
    Buffers[3].pvBuffer = SECBUFFER_EMPTY; 

    Message.cBuffers = 4; 
    Message.pBuffers = Buffers; 
    Message.ulVersion = SECBUFFER_VERSION; 

    scRet = EncryptMessage(&hContext, 0, &Message, 0); 
    if (send(hSocket, (const char*)pbloBuffer, Buffers[0].cbBuffer + Buffers[1].cbBuffer + Buffers[2].cbBuffer, 0) < 0) { 
     MessageBox(0, L"Send error", 0, 0); 
    } 


    return 0; 
} 

Antwort

1

erste - Sie müssen nur einmal QueryContextAttributesW rufen SEC_E_OK nach InitializeSecurityContextW Rückkehr - keinen Sinn nennen es jedes Mal, , wenn Sie Daten senden müssen. und speichern Sie das Ergebnis. erben sagen, dass Ihre Klasse von SecPkgContext_StreamSizes - class Adaptify : SecPkgContext_StreamSizes; und fordern Ende Händedruck (einmal) QueryContextAttributesW(&hContext, SECPKG_ATTR_STREAM_SIZES, this);

über Daten Senden Senden - in Ihrem Fall Buffers[1].pvBuffer natürlich auf Ihre aktuellen Daten pbloBuffer zeigen muss aber nicht beschränkt auf pbloBuffer + Sizes.cbHeader Code wie folgt sein:

int Adaptify::EncryptSend(PBYTE pbloBuffer, int Size) { 

    SECURITY_STATUS ss = SEC_E_INSUFFICIENT_MEMORY; 

    if (PBYTE Buffer = new BYTE[cbHeader + Size + cbTrailer]) { 

     memcpy(Buffer + cbHeader, pbloBuffer, Size); 

     SecBuffer sb[4] = { 
      { cbHeader, SECBUFFER_STREAM_HEADER, Buffer}, 
      { Size, SECBUFFER_DATA, Buffer + cbHeader}, 
      { cbTrailer, SECBUFFER_STREAM_TRAILER, Buffer + cbHeader + Size}, 
     }; 

     SecBufferDesc sbd = { 
      SECBUFFER_VERSION, 4, sb 
     }; 

     if (SEC_E_OK == (ss = ::EncryptMessage(this, 0, &sbd, 0)))) { 
      if (SOCKET_ERROR == send(hSocket, (const char*)Buffer, sb[0].cbBuffer+sb[1].cbBuffer+sb[2].cbBuffer+sb[3].cbBuffer, 0)) 
       ss = WSAGetLastError(); 
     } 
     delete [] Buffer; 
    } 
    return ss; 
} 

so müssen Sie mit cbHeader + Size + cbTrailer Größe neuer Puffer zuweisen (wher Size Ihre eigentliche Nachricht Size ist und kopieren Sie Ihre Nachricht an Buffer + cbHeader

+0

Danke! (I Ich las den Quelltext der Jungs durch und fand heraus, dass er alles umschaltet, bevor er die SendEncrypt-Funktion aufruft. Ich schätze Ihre Hilfe. –

Verwandte Themen