Здравствуйте, TermoYDR, Вы писали:
TYD>шифрую строку текста, использую CryptoAPI, агл. шифрование RC4 TYD>проблема в том, что если строока больше 132 символов, после шифрования на выходе получается обрезанная строка
уточните, что значит "обрезанная строка" ? как вы это проверяете?
у вас места хватает в буфере?
вообще, в std::string так лучше не писать
вот такой метакод я бы вам предложил:
Здравствуйте, TermoYDR, Вы писали:
TYD>Конечно понимаю что я ламо, но как такое может быть казалось бы на ровном месте?
Вероятно дело в нуль-символе.
TYD>Если все же может, скажите как все таки нужно копировать строку в таких случаях, наставьте на путь истинный!
Вероятно, raw данные не стоит хранить в std::string или подобном.
шифрую строку текста, использую CryptoAPI, агл. шифрование RC4
проблема в том, что если строока больше 132 символов, после шифрования на выходе получается обрезанная строка
В и-нете объяснения не нашел, хотелось бы знать это ограничение самого алгоритма или я делаю что-то не так
Спасибо!
Здравствуйте, uzhas, Вы писали:
U>уточните, что значит "обрезанная строка" ? как вы это проверяете? U>у вас места хватает в буфере? U>вообще, в std::string так лучше не писать
Сделал как Вы сказали, в результате, когда я копирую текст (уже шифрованный)из вектора в string, а потом из string в AnsiString(для отображения в Memo допустим) стока копируется не вся.
Манипуляции:
соответственно, если такую строку дешифровать, результат получится не тот что нужно (обрезанный)
но если я дешифрую сам вектор (buffer), то результат получится правильный (дешифрованная строка равна исходной)
Вывод — в вектор(buffer)передается все-же вся шифрованная строка и дело не в шифровании, а в копировании строк.
Конечно понимаю что я ламо, но как такое может быть казалось бы на ровном месте?
Если все же может, скажите как все таки нужно копировать строку в таких случаях, наставьте на путь истинный!
Спасибо!
Здравствуйте, wander, Вы писали:
W>Вероятно дело в нуль-символе.
Вы оказались правы! хотя я сам должен был подумать о нуль-символе.
сделал как советовал господин uzhas:
std::string msg = "12345...";
std::vector<char> buffer(msg.begin(), msg.end());
DWORD buffer_size = buffer.size();
if (!CryptEncrypt(hSessionKey, 0, true, 0, (BYTE*)&buffer[0],
&buffer_size, buffer_size))
return;
buffer.resize(buffer_size);
AnsiString output111;
//передаем из vector в AnsiString посимвольно for (int i=0; i<buffer_size; i++)
output += buffer.operator [](i);
В итоге в AnsiString у нас будет строка целиком, и не беда, что эту строку нельзя полностью отобразить через Memo, при дешифрации получается целая строка без потерь!
всем спасибо!
Здравствуйте, wander, Вы писали:
TYD>>Если все же может, скажите как все таки нужно копировать строку в таких случаях, наставьте на путь истинный! W>Вероятно, raw данные не стоит хранить в std::string или подобном.
можно их там хранить.
только не пользоваться c_str().