gpt4 book ai didi

C++ - EncryptMessage 没有加密正确的数据

转载 作者:行者123 更新时间:2023-11-28 05:18:28 37 4
gpt4 key购买 nike

我一直在关注 SSL/TLS 在线教程(更多的是阅读这些人的源代码并继续学习)但是我在这个 EncryptMessage 部分遇到了一条坎坷的道路,因为它把数据推开了并对错误信息进行加密。

我发送给它的 pbloBuffer 是:

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

但是当我执行 pbMessage = pbloBuffer + Sizes.cbHeader;我最终得到了(甚至微软网站都说要这样做)

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

现在 pbMessage 是上面的代码,它被插入到 SECBUFFER_DATA 下,所以它甚至没有得到完整的数据。据我了解,SECBUFFER_DATA 是网络服务器将解码和处理的“用户”数据。

您能找到解决此问题并正确发送加密数据的方法吗?

完整来源:(此代码是实验性的,因为我在进行更改之前试图理解它)

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

最佳答案

首先 - 您只需要在 InitializeSecurityContextW 返回 SEC_E_OK 之后调用一次 QueryContextAttributesW - 当您需要发送数据时,每次调用它都没有意义。并保存结果。假设从 SecPkgContext_StreamSizes 继承你的类 - class Adaptify : SecPkgContext_StreamSizes; 并调用结束握手(一次)QueryContextAttributesW(&hContext, SECPKG_ATTR_STREAM_SIZES, this);

关于发送发送数据 - 在您的情况下 Buffers[1].pvBuffer 当然必须指向您的实际数据 pbloBuffer 而不是 pbloBuffer + Sizes。 cbHeader代码可以是这样的:

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

因此您需要分配新的缓冲区,大小为 cbHeader + Size + cbTrailer(Size 是您的实际消息 Size 并将您的消息复制到缓冲区 + cbHeader

关于C++ - EncryptMessage 没有加密正确的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42051656/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com