Re: шифрование RC4 длина строки (CryptoAPI)
От: uzhas Ниоткуда  
Дата: 18.04.11 08:16
Оценка: 3 (2)
Здравствуйте, TermoYDR, Вы писали:

TYD>шифрую строку текста, использую CryptoAPI, агл. шифрование RC4

TYD>проблема в том, что если строока больше 132 символов, после шифрования на выходе получается обрезанная строка
уточните, что значит "обрезанная строка" ? как вы это проверяете?
у вас места хватает в буфере?
вообще, в std::string так лучше не писать
вот такой метакод я бы вам предложил:
  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);
  std::cout << " msg size: " << msg.size() << ", encrypted msg size: " << buffer.size() << std::endl;
  //output text, is it printable or binary?
  std::string output(buffer.begin(), buffer.end());
  std::cout << "encrypted msg: " << output << std::endl;
Re[3]: шифрование RC4 длина строки (CryptoAPI)
От: wander  
Дата: 18.04.11 16:23
Оценка: 2 (1) +1
Здравствуйте, TermoYDR, Вы писали:

TYD>Конечно понимаю что я ламо, но как такое может быть казалось бы на ровном месте?

Вероятно дело в нуль-символе.

TYD>Если все же может, скажите как все таки нужно копировать строку в таких случаях, наставьте на путь истинный!

Вероятно, raw данные не стоит хранить в std::string или подобном.
Re[3]: шифрование RC4 длина строки (CryptoAPI)
От: quodum  
Дата: 18.04.11 10:31
Оценка: 2 (1)
Здравствуйте, TermoYDR, Вы писали:

TYD>DWORD count=strlen(mstring);


А, точно. Старый, слепой, Пью...

На самом деле см. ответ от uzhas. Нельзя использовать результат c_str() для записи, это UB.
шифрование RC4 длина строки (CryptoAPI)
От: TermoYDR  
Дата: 18.04.11 05:45
Оценка:
шифрую строку текста, использую CryptoAPI, агл. шифрование RC4
проблема в том, что если строока больше 132 символов, после шифрования на выходе получается обрезанная строка
В и-нете объяснения не нашел, хотелось бы знать это ограничение самого алгоритма или я делаю что-то не так
Спасибо!


HCRYPTPROV hProv;
HCRYPTKEY hSessionKey;
HCRYPTHASH hHash;

LPCSTR sKey = "WrSxnCNBpJ7Ko4[e#,7Ty)a0ykP)62Ce[.bAA;SuOf4*{nagx4s,;5!eHU!v=p3z";
int lHashPassword = strlen(sKey);

if (!CryptAcquireContext(&hProv, NULL, NULL,
    PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
  return;

if(!CryptCreateHash(hProv, CALG_SHA, 0, 0, &hHash))
  return;

if(!CryptHashData(hHash, sKey, lHashPassword, 0))
  return;

if (!CryptDeriveKey(hProv, CALG_RC4, hHash, 128 << 16 , &hSessionKey))
  return;

AnsiString s = "1234567890123445678901234567890123456789012345678901234567891234567890123456789012345678901234567890123456789012345678901234567890123";

char *mstring = s.c_str();
DWORD count=strlen(mstring);

if (!CryptEncrypt(hSessionKey, 0, true, 0, (BYTE*)mstring,
    &count, strlen(mstring)))
  return;
Re: шифрование RC4 длина строки (CryptoAPI)
От: quodum  
Дата: 18.04.11 07:02
Оценка:
Здравствуйте, TermoYDR,

В приведённом фрагменте кода отсутствует объявление и инициализация переменной count.
Re[2]: шифрование RC4 длина строки (CryptoAPI)
От: TermoYDR  
Дата: 18.04.11 07:46
Оценка:
Здравствуйте, quodum, Вы писали:

Q>Здравствуйте, TermoYDR,


Q>В приведённом фрагменте кода отсутствует объявление и инициализация переменной count.


DWORD count=strlen(mstring);
разве это не оно?
Re[2]: шифрование RC4 длина строки (CryptoAPI)
От: TermoYDR  
Дата: 18.04.11 15:36
Оценка:
Здравствуйте, uzhas, Вы писали:

U>уточните, что значит "обрезанная строка" ? как вы это проверяете?

U>у вас места хватает в буфере?
U>вообще, в std::string так лучше не писать

Сделал как Вы сказали, в результате, когда я копирую текст (уже шифрованный)из вектора в string, а потом из string в AnsiString(для отображения в Memo допустим) стока копируется не вся.
Манипуляции:
std::string output(buffer.begin(), buffer.end());
Memo3->Text = output.c_str();

соответственно, если такую строку дешифровать, результат получится не тот что нужно (обрезанный)
но если я дешифрую сам вектор (buffer), то результат получится правильный (дешифрованная строка равна исходной)
Вывод — в вектор(buffer)передается все-же вся шифрованная строка и дело не в шифровании, а в копировании строк.
Конечно понимаю что я ламо, но как такое может быть казалось бы на ровном месте?
Если все же может, скажите как все таки нужно копировать строку в таких случаях, наставьте на путь истинный!
Спасибо!
Re[4]: шифрование RC4 длина строки (CryptoAPI)
От: TermoYDR  
Дата: 19.04.11 09:08
Оценка:
Здравствуйте, 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, при дешифрации получается целая строка без потерь!
всем спасибо!
Re[4]: шифрование RC4 длина строки (CryptoAPI)
От: blackhearted Украина  
Дата: 19.04.11 10:13
Оценка:
Здравствуйте, wander, Вы писали:

TYD>>Если все же может, скажите как все таки нужно копировать строку в таких случаях, наставьте на путь истинный!

W>Вероятно, raw данные не стоит хранить в std::string или подобном.
можно их там хранить.
только не пользоваться c_str().
Re[5]: шифрование RC4 длина строки (CryptoAPI)
От: wander  
Дата: 19.04.11 14:06
Оценка:
Здравствуйте, blackhearted, Вы писали:

B>можно их там хранить.


Я разве сказал, что нельзя?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.