我实施的系统使用libcrafter
和crypto++
来传输网络上的特定帧。但我遇到的问题根本就不在这个层面。
关于这些库中使用的类型之间的转换。
我尝试将Crafter::byte array
转换为std::string
,以便将此消息放入网络框架中(作为AES的初始化向量)加密/解密)。
此外,iv
必须归零,我无法正确初始化(尽管答案为here或there)。
编辑:要将其初始化为00,我必须以十六进制 :0x30。并将它转换为std::string
我必须提供长度,即ivLen2(感谢答案)。
这就是我的所作所为:
const int ivLen2 = 2;
std::string encrypted_message("whatever");
Crafter::byte iv[ivLen2]={0x30, 0x30}; // crypto salt of 2 bytes at 0.
std::string ivStr( reinterpret_cast< char const* >(iv), ivLen2 ) ;
string mess2send = ivStr + encrypted_message;
如果我用它显示它们:
cout<<"iv[0] : "<<iv[0]<<endl; // display 0
cout<<"mess2send : "<<mess2send<<endl; // display 00whatever
为什么我不创建一个归零字符串并发送它?为了拥有通用函数和可重复使用的代码。
没有惊喜我必须做相反的事情。我得到一个iv
和message
在vector<byte>* payload
内连接,我必须将iv提取为byte array
,并将message
提取到字符串中。
鉴于message
接近std::string
,vector
实际上并不是问题。
以下是我试图检索iv
:
Crafter::byte iv[ ivLen2 ];
for (int i = 0; i < ivLen2; i++)
{
iv[i] = (byte)payload->at(i);
}
std::string iv_rcv( reinterpret_cast< char const* >(iv) ) ;
为了显示它们,我(在同一个循环中):
cout<<iv[i];
但它给了我一个非ASCII字符。
Crafter::byte* iv;
std::string iv_rcv( payload->begin(), payload->begin()+ivLen2 ) ;
iv = (byte*)iv_rcv.c_str();
但它并没有给我假定的初始化值......
有人有线索吗?我的代码错了吗?
答案 0 :(得分:1)
我认为这不会起作用:
const int ivLen2 = 2;
std::string encrypted_message("whatever");
Crafter::byte iv[ivLen2]={0x00, 0x00}; // crypto salt of 2 bytes
std::string ivStr( reinterpret_cast< char const* >(iv) ) ;
std::string
如何知道要从iv
指针复制多少数据?
你必须使用一个构造函数来获取数据的 length ,如:
std::string ivStr( reinterpret_cast< char const* >(iv), ivLen2 ) ;
仅指针构造函数用于由 null字符终止的特定编码字符串。除非你使用其中一个,否则你必须通过这个长度。
试试这个:
const int ivLen2 = 2;
std::string encrypted_message("whatever");
Crafter::byte iv[ivLen2]={0x00, 0x00}; // crypto salt of 2 bytes
std::string ivStr( reinterpret_cast< char const* >(iv), ivLen2 ) ;
std::string mess2send = ivStr + encrypted_message;
std::cout << (int)mess2send[0] << (int)mess2send[1] << mess2send.substr(2) << '\n';