- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在关注 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/
我一直在关注 SSL/TLS 在线教程(更多的是阅读这些人的源代码并继续学习)但是我在这个 EncryptMessage 部分遇到了一条坎坷的道路,因为它把数据推开了并对错误信息进行加密。 我发送给它
当使用具有有效上下文的 win32 API 中的 EncryptMessage (SChannel) 时,我以正确的顺序提供了四个缓冲区,我得到了 SEC_E_INVALID_TOKEN 响应,根据文
我是一名优秀的程序员,十分优秀!