我正在开发实时通信应用程序的加密版本。我遇到的问题是,发送到接收器的加密数据包有问题。错误日志中的一个示例:(十六进制编码数据,原始数据是纯字节代码)。
已发送:262C1688215232656B5235B691826A21C51D37A99413050BAEADB81D8892493FC0DB519250199F5BE73E18F2703946593C4F6CEA396A168B3313FA689DE84F380606ED3C322F2ADFC561B9F1571E29DF5870B59D2FCF497E01D9CD5DFCED743559C3EE5B00678966C8D73EA3A5CD810BB848309CDF0F955F949FDBA618C401DA70A10C36063261C5DBAB0FC0F1
收到:262C1688215232656B5235B691826A21C51D37A99413050BAEADB81D8892493FC0DB519250199F5BE73E18F2703946593C4F6CEA396A168B3313FA689DE84F380606ED3C322F2ADFC561B9F1571E29DF5870B59D2FCF497E01D9CD5DFCED743559C3EE5B00CDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCD
这是send-method的调用:
string encSendBuffer = sj->cipherAgent->encrypt(sj->dFC->sendBuffer, sj->dFC->sendBytes);
char* newSendBuffer = new char[encSendBuffer.length() + 1];
strcpy(newSendBuffer, encSendBuffer.c_str());
sj->dFC->s->async_send_to(boost::asio::buffer(newSendBuffer, encSendBuffer.length()),
*sj->dFC->f,
boost::bind(&sender::sendHandler, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred)
)
sj->dFC->s
是UDP-Socket,sj->dFC->f
是UDP端点。
sendHandler的错误代码始终为system: 0
这是我使用Crypto ++库进行加密的方法:(提取)
string cipherEngine::encrypt(char* input, int length)
{
string cipher = "";
CTR_Mode<AES>::Encryption e;
e.SetKeyWithIV(key, keyLength, iv);
ArraySource as((byte*)input, length, true,
new StreamTransformationFilter(e,
new StringSink(cipher)
)
);
return cipher;
}
UPDATE:接收功能代码:
void receiver::receive(){
int maxLength = 4096;
sj->dFC->s->async_receive_from(boost::asio::buffer(input,maxLength),
senderEndpoint,
boost::bind(&receiver::handleReceiveFrom, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
收到数据后,它将存储在char缓冲区input
中,并在handleReceiveFrom
函数中解密。
没有加密一切都很好。在接收器端,所发送的字节数始终是正确的。 de&#34; CD&#34; - 块的长度非常随机。我已经检查了加密,解密数据与原始纯文本相同。
有没有人知道这种行为来自哪里?
答案 0 :(得分:4)
这里的关键是错误数据在加密数据数组中的第一个空值(0x00)之后开始。以下一行:
strcpy(newSendBuffer, encSendBuffer.c_str());
...看起来它只复制到数据,直到该空字节进入newSendBuffer。 send函数发送缓冲区内容就好了;缓冲区只是没有你期望的数据。您需要以不同的方式加载newSendBuffer,而不是使用可以处理空字节的strcpy()。试试std :: memcpy()。
答案 1 :(得分:0)
谢谢Joachim Pileborg和Jack O&#39; Reilly!你确实是对的。
我从strcpy(newSendBuffer, encSendBuffer.c_str());
到
for (int i = 0; i < encSendBuffer.length(); i++)
{
newSendBuffer[i] = encSendBuffer.at(i);
}
发送方和接收方。它实际上解决了这个问题。这是非常天真的代码,但它做了应有的事情。
std::memcpy()
似乎更优雅,我会尝试一下。