Я внедряю систему, которая использует libcrafter
а также crypto++
для передачи определенных кадров в сети. Но проблема, с которой я застрял, совсем не на этом уровне.
Речь идет о преобразовании между типами, используемыми в этих библиотеках.
Я пытаюсь преобразовать Crafter::byte array
к std::string
для того, чтобы поместить это сообщение в кадр сети (как вектор инициализации для шифрования / дешифрования AES).
Кроме того, iv
должен быть обнулен, и я не могу инициализировать его должным образом (несмотря на ответы Вот или же там).
РЕДАКТИРОВАТЬ : чтобы инициализировать его в 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();
Но это не дает мне предполагаемый инициализированные значения …
У кого-нибудь есть подсказка? Мой код неверен?
Я не думаю, что это будет работать:
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
указатель?
Вы должны использовать конструктор, который принимает длина из данных, как:
std::string ivStr( reinterpret_cast< char const* >(iv), ivLen2 ) ;
только указатель Конструктор предназначен для специально закодированных строк, которые заканчиваются нулевой символ. Если вы не используете один из тех, вы должны пройти длину.
Попробуй это:
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';