
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Шифровку тоже надо бы подправить, т.к. код #13 предполагает, что длина зашифрованного текста всегда будет больше длины исходного. Лучше сделать так:
![]() ![]() X:=Length(login); if CryptEncrypt(key, 0, True, 0, nil, @X, X) then //при pbData=Nil просто в X возвращается требуемая длина begin if X > Length(login) then SetLength(login, X) else UniqueString(login); if not CryptEncrypt(key, 0, True, 0, Pointer(login), @X, X) then RaiseLastOSError else if X <> Length(login) then SetLength(login, X); end else RaiseLastOSError; |
Сообщ.
#17
,
|
|
|
CodeMonkey Подскажи запутался все равно ругается!
![]() ![]() login:=z_text; X := Length(login); if not CryptDecrypt(key, 0, True, 0, Pointer(login), @X) then RaiseLastOSError; Добавлено Спасибо! Расшифровывает, но только в конце слова не понятные символы доставляет!? |
Сообщ.
#18
,
|
|
|
Цитата mawa @ Расшифровывает, но только в конце слова не понятные символы доставляет!? При дешифровке длина текста уменьшается, добавь коррекцию длины: ![]() ![]() if not CryptDecrypt(key, 0, True, 0, Pointer(login), @X) then RaiseLastOSError else if X <> length(login) then SetLength(login,X); |
Сообщ.
#19
,
|
|
|
_________________________
Пример: Исходное : qweqweqweqwe27@ Расшифрованное : qweqweqweqwe27@ Добавлено Все работает !!!! leo Спасибо Большое !!!!!!!! respect! |
Сообщ.
#20
,
|
|
|
Цитата mawa @ login:=z_text; Учти, что при этом после CryptDecrypt строка z_text тоже изменится. Чтобы не изменялась нужно либо добавить UniqueString(login); либо сразу вместо присваивания сделать SetString(login,pChar(z_text),Length(z_text)); |
Сообщ.
#21
,
|
|
|
Вопрос, если пароль не правильный выдает плохие данные, тогда необходимо использовать связку : try - exsept ?
|
Сообщ.
#22
,
|
|
|
Да, если нужно вывести сообщение или еще что-то сделать.
Плюс закрытие всех хэндлов лучше делать в try\finally PS: странно, что у тебя FormatMessage не ту ошибку выдал, т.к. RaiseLastOSError использует тот же механизм |
Сообщ.
#23
,
|
|
|
leo
А зачем сохранять ![]() ![]() login:=z_text; Все итак нормально работает? |
Сообщ.
#24
,
|
|
|
Работать то работает, но при присваивании login:=z_text может копироваться только указатель на строку, в итоге login и z_text будут указывать на один и тот же текст и соотв-но изменение login в Decript приведет также и к изменению z_text. Если это не важно, то тогда вроде и незачем присвоение login:=z_text делать - можно сразу с z_text работать. Если же z_text не должна меняться, то нужно сделать UniqueString(login)
Добавлено Кстати вместо FormatMessage можно использовать SysErrorMessage из SysUtils ![]() ![]() e:=GetLastError; ShowMessage('Error '+IntToStr(e)+'. '+SysErrorMessage(e)); PS: Это если вместо генерации исключения просто выдавать сообщение об ошибке |
Сообщ.
#25
,
|
|
|
leo спасибо за помощь! Очень помоГ!
|
Сообщ.
#26
,
|
|
|
mawa, тебе тоже спс - за интересный вопрос
![]() |
Сообщ.
#27
,
|
|
|
Цитата leo @ PS: странно, что у тебя FormatMessage не ту ошибку выдал, т.к. RaiseLastOSError использует тот же механизм Я не удивлюсь, если авто вопроса напутал и с вызовом FormatMessage - поэтому FormatMessage возвращал не столько описание ошибки, сколько ошибку при вызове себя или что-то вроде этого. Похоже, автор вопроса больше действует методом научного тыка, слабо понимая, что же вообще он пишет. |
Сообщ.
#28
,
|
|
|
CodeMonkey
А где я напутал - вызов FormatMessage? Я в прошлом году делал лабу по алгоритму RC4, там все было ок, и литературы хватало. А вот с AES, сам не справился! Еще раз спасибо! |
Сообщ.
#29
,
|
|
|
А почему некоторые слова шифруется, но не расшифровываются (p.s. пароль ввожу верно)? Пишит - плохие данные!
Шифрование ![]() ![]() login:=text; // вход: login - данные для шифрования // Шаг 1: определяем, сколько надо байт для хранения зашифрованного текста X := Length(login); if not CryptEncrypt(key, 0, True, 0, Pointer(login), @X, Length(login)) then if GetLastError <> ERROR_MORE_DATA then RaiseLastOSError; // Шаг 2: выделили буфер (уже не 512, а ровно, сколько надо) Y := Length(login); SetLength(login, X); // Шаг 3: шифрование if not CryptEncrypt(key, 0, True, 0, Pointer(login), @Y, Length(login)) then RaiseLastOSError; SetLength(login, Y); {освобождаем контекст криптопровайдера} CryptReleaseContext(hProv, 0); Расшифрование ![]() ![]() login:=z_text; X := Length(login); if not CryptDecrypt(key, 0, True, 0, Pointer(login), @X) then RaiseLastOSError else if X <> length(login) then SetLength(login,X); {освобождаем контекст криптопровайдера} CryptReleaseContext(hProv, 0); |
Сообщ.
#30
,
|
|
|
Частный случай:
Проблема в том что когда шифруется слово получается длина 32 символа, затем это слово записуется в файлик. А при расшифровании считывается из файлика, но считывается 8 символов!! Что делать? Зашифр. ![]() ![]() //созд.файла AssignFile(f,Edit3.Text+'.txt'); Rewrite(f); CloseFile(f); //открытие на до запись AssignFile(f,Edit3.Text+'.txt'); Append(f); //шифрование login:=login+'|@@|'+pass; str:=Zawufrovat(password,login); writeln(f,str); CloseFile(f); расшифр ![]() ![]() //открытие файла t:=OpenDialog1.FileName; try AssignFile(f,t); reset(f); except; ShowMessage('Ошибка чтения файла !'); Exit; end; //читаем логин+пароль+конст readln(f,str); ShowMessage(IntToStr(length(str))+' '+str[length(str)]); password:=MaskEdit1.Text+p_const; //расшифрование try str:=Raswufrovat(password,str); except; ShowMessage('Не верный пароль 1!'); memo2.Lines.Add(password); Exit; end; |