
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Страницы: (3) 1 2 [3] все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
Писать и читать файл как двоичный.
|
Сообщ.
#32
,
|
|
|
Видимо вызвал GetLastError повторно после вызова другой функции (например RaiseLastOSError или ShowMessage), хотя в #10 я тебе показывал как надо делать - вызвать один раз сразу после ошибки и сохранить значение в переменной для последующих манипуляций. Цитата mawa @ Проблема в том что когда шифруется слово получается длина 32 символа, затем это слово записуется в файлик. А при расшифровании считывается из файлика, но считывается 8 символов!! Что делать? Мда, чудак ты, брат ![]() С чего ты взял, что после шифрования твой текст останется вообще читабельным текстом, да еще и однострочным. Все стандартные алгоритмы шифрования - двоичные, а не символьные, поэтому в результате шифрования в строке могут оказаться служебные символы, например перевода строки $13, $10 и даже $0 - признак конца текста. Поэтому записывать\читать зашифрованные данные нужно в двоичный файл, а не в текстовый ![]() ![]() var f:file; begin ... AssignFile(f,FileName); //запись строки str в файл try rewrite(f,1); blockwrite(f,str[1],Length(str)); finally CloseFile(f); end; ... //чтение строки str из файла try reset(f,1); SetLength(str,FileSize(f)); //задаем размер строки = размеру файла blockread(f,str[1],Length(str)); //читаем весь файл finally CloseFile(f); end; Добавлено mawa И еще, несмотря на мое замечание #16, ты продолжаешь использовать вариант шифрования #29, предполагающий что длина зашифрованного текста всегда больше исходной. Ты уверен, что это так ? Я не уверен. Ясно, что AES блочный шифр, поэтому длина входного текста выравнивается вверх на 16 или 32 байта. Но если длина твоего login уже равна 16 или 32, то длина может и не измениться и в итоге алгоритм #29 зашифрует строку дважды. Правда я в #16 тоже накосячил с длинами, поэтому правильный вариант должен быть такой: ![]() ![]() X:=Length(login); if CryptEncrypt(key, 0, True, 0, nil, @X, X) then //при pbData=Nil просто в X возвращается требуемая длина begin Y:=Length(login); if X > Y then SetLength(login, X) else UniqueString(login); if not CryptEncrypt(key, 0, True, 0, Pointer(login), @Y, X) then RaiseLastOSError else if Y <> Length(login) then SetLength(login, Y); end else RaiseLastOSError; |