使用Boost :: asio :: async_send_to发送加密数据时出错

时间:2015-01-29 14:58:40

标签: c++ encryption aes boost-asio crypto++

我正在开发实时通信应用程序的加密版本。我遇到的问题是,发送到接收器的加密数据包有问题。错误日志中的一个示例:(十六进制编码数据,原始数据是纯字节代码)。

已发送: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; - 块的长度非常随机。我已经检查了加密,解密数据与原始纯文本相同。

有没有人知道这种行为来自哪里?

2 个答案:

答案 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()似乎更优雅,我会尝试一下。