windows - C ++ - EncryptMessage ikke krypterer de korrekte data

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har fulgt denne vejledning til SSL/TLS online (ja det er mere at læse kildens kildekode og følge med), men jeg har ramt en ujævn vej med denne EncryptMessage-del, fordi den skubber dataene ud af vejen og krypterer Forkert information.


Den pbloBuffer, jeg sender det, er:


GET / HTTP/1.1

HOST: www.google.com




Men når jeg gør pbMessage=pbloBuffer + Sizes.cbHeader; Jeg ender med (selv Microsoft websites siger at gøre dette)


1

HOST: www.google.com




Nu er pbMessage koden ovenfor, og den er indsat under SECBUFFER\_DATA, så det får ikke engang de fulde data. Fra hvad jeg forstår SECBUFFER\_DATA er 'bruger' data, som webserveren vil afkode og behandle.


Kan du finde ud af, hvordan du løser dette og sender de krypterede data korrekt?


Fuld kilde: (Denne kode er eksperimentel som jeg forsøger at forstå det, før jeg foretager ændringer)


    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;
}

Bedste reference


først - du skal ringe QueryContextAttributesW kun en gang efter InitializeSecurityContextW returnere SEC\_E\_OK - uden fornuft kalde det hver gang, når du har brug for at sende data. og gem resultatet. sig arve din klasse fra SecPkgContext\_StreamSizes - class Adaptify : SecPkgContext\_StreamSizes; og kalde på endehåndtryk (en gang) QueryContextAttributesW(&hContext, SECPKG\_ATTR\_STREAM\_SIZES, this);


om send sende data - i dit tilfælde Buffers[1].pvBuffer skal selvfølgelig pege på dine faktiske data pbloBuffer, men ikke til pbloBuffer + Sizes.cbHeader kode kan være som denne:


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;
}


så du skal allokere ny buffer med cbHeader + Size + cbTrailer størrelse (hvor Size er din aktuelle meddelelse Size og kopi din besked på Buffer + cbHeader