Frxcrypt
mvb
Казань
Здравствуйте! Д2009, fr4_8_21_d12.
Пытаюсь сделать функции по шифрованию и сжатию файлов с использованием функций из модулей frxCrypt и frxGZip.
Пытаюсь сделать функции по шифрованию и сжатию файлов с использованием функций из модулей frxCrypt и frxGZip.
const
CryptKey = ansistring('криптоключ');
function mvbDecryptFile(const FileName: string): string;
var fs: TFileStream;
dst, src: TStringStream;
begin
fs := TFileStream.Create(FileName, fmOpenRead);
dst := TStringStream.Create;
src := TStringStream.Create;
try
frxDecryptStream(fs, src, CryptKey);
//src.CopyFrom(fs, fs.Size);
src.Position := 0;
frxDecompressStream(src, dst);
Result := dst.DataString;
finally
dst.Free;
src.Free;
fs.Free;
end;
end;
function mvbEncryptFile(const Data, FileName: string): boolean;
var fs: TFileStream;
src, dst: TStringStream;
begin
fs := TFileStream.Create(FileName, fmCreate);
src := TStringStream.Create;
dst := TStringStream.Create;
try
src.WriteString(Data);
src.Position := 0;
frxCompressStream(src, dst, gzMax, ExtractFileName(FileName));
frxCryptStream(dst, fs, CryptKey);
{dst.Position := 0;
fs.CopyFrom(dst, dst.Size);}
finally
src.Free;
dst.Free;
fs.Free;
end;
Result := FileExists(FileName);
end;
Если исключить криптование (и раскомментировать прямое копирование данных), то все работает, если делать как хочется (выше) - то после расшифровки вылетает "data error" на frxDecompressStream(src, dst). Делал наоборот - сжатие, потом криптование - работает как надо, но коэффициент сжатия при этом практически нулевой. Подскажите, что я не так делаю?
Комментарии
Ошибка у Вас в типе, String начиная с Delphi 2009 по умолчанию 2-х байтовый WideString. TStringStream доже по умолчанию создает 2-х байтовый стринг стрим.
нужно сделать так:
1. Заменить у mvbDecryptFile возвращаемый тип на AnsiString и у mvbEncryptFile Data тоже AnsiString.
2. TStringStream нужно создавать так TStringStream.Create('', TEncoding.ASCII) или так TStringStream.Create('', TEncoding.UTF8) , в зависимости от требований.
Функция _UnicodeToAnsi из вашего же модуля frxUnicodeUtils. Закомментирован еще один нерабочий вариант.
function mvbDecryptFile(const FileName: string): string;
Тип должен быть AnsiString ... криптование возвращает набор байтов , а Вы его не явно конвертируете в юникод.
Т.е. чтобы заполнить блок до конца добавляются пробелы, а после декриптования они убиваются вместе со спец символами.
Можно конечно сделать свой аналог trim без удаления управляющих символов, только нет гарантии, что стрим не заканчивался пробелом $20.
Поэтому придется делать все наоборот: криптовать , а потом сжимать.
Ну и конечно правильно конвертировать, т.е. если нужно криптовать строку юникода, конвертировать ее в utf8.
Да, именно этот.
Лучший вариант это записывать размер исходной строки в криптованный стрим, но алгоритм не наш и пока менять его не хочется.