(решено) Шифрование файла с помощью BlowFish

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

(решено) Шифрование файла с помощью BlowFish

Сообщение son » 06.03.2017 16:40:16

Доброго времени суток. Пытаюсь сделать шифрование файла с помощью BlowFish. Пробую модифицировать пример и получаю "шляпу". Вод код:

Код: Выделить всё

var
  Form1: TForm1;
  sTemp : string;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var be : TBlowFishEncryptStream;
    ss : TStringStream;
    se : TStringStream;
begin
  try
    ss := TStringStream.Create('4 15.02.2017 05:26:17 ТЕСТ МОДУЛЬ АНАЛИЗА. 15.02.2017 5:26:06;ТЕКСТ;');
    se := TStringStream.Create('');
    be := TBlowFishEncryptStream.Create(Edit1.Text,se);
    be.WriteBuffer(ss.DataString[1],ss.Size);
    sTemp:=se.DataString;
    Memo1.Text:=se.DataString;
    be.free;
  finally
    ss.Free;
    se.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var bd : TBlowFishDeCryptStream;
    tmp : string;
    se : TStringStream;
begin
  try
    se := TStringStream.Create(sTemp);
    bd := TBlowFishDeCryptStream.Create(Edit1.Text,se);
    SetLength(tmp,bd.Size);
    bd.Read(tmp[1],bd.Size);
    Memo1.Text:=tmp;

    bd.free;
  finally
  end;



Шифрует вроде, а при дешифровки крашится при обращении к SetLength(tmp,bd.Size);
Последний раз редактировалось son 08.03.2017 12:45:23, всего редактировалось 1 раз.
son
новенький
 
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

Re: Шифрование файла с помощью BlowFish

Сообщение olegy123 » 06.03.2017 17:26:36

son писал(а):крашится при обращении к SetLength(tmp,bd.Size);

значит в bd := TBlowFishDeCryptStream.Create(Edit1.Text,se);
bd не инициализирован.. отсюда bd.size - невозможно извлечь.

Добавлено спустя 1 минуту 54 секунды:
вообще то я поосторожнее извлекал из Edit1.Text бинарные данные.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Шифрование файла с помощью BlowFish

Сообщение son » 06.03.2017 17:32:40

olegy123 писал(а):вообще то я поосторожнее извлекал из Edit1.Text бинарные данные

Там ключ для шифрования
son
новенький
 
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

Re: Шифрование файла с помощью BlowFish

Сообщение olegy123 » 06.03.2017 17:41:03

У меня был опыт работы с шифрованием, полдня ушло чтобы понять, в конце string символ #13#10 был лишний.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Шифрование файла с помощью BlowFish

Сообщение son » 06.03.2017 17:46:09

olegy123 писал(а):У меня был опыт работы с шифрованием, полдня ушло чтобы понять, в конце string символ #13#10 был лишний.

Проверил. Вроде не мой случай. Одна строка без символов #13#10 шифрует но не расшифровывает.
son
новенький
 
Сообщения: 39
Зарегистрирован: 22.11.2011 11:50:58

Re: Шифрование файла с помощью BlowFish

Сообщение tryexceptend » 07.03.2017 14:26:40

Нашел. Надо be.Flush; сделать что бы запись завершить кодированных данных:

Код: Выделить всё
var
  Form1: TForm1;
  sTemp : string;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var be : TBlowFishEncryptStream;
    ss : TStringStream;
    se : TStringStream;
begin
  try
    ss := TStringStream.Create('4 15.02.2017 05:26:17 ТЕСТ МОДУЛЬ АНАЛИЗА. 15.02.2017 5:26:06;ТЕКСТ;');
    se := TStringStream.Create('');
    be := TBlowFishEncryptStream.Create(Edit1.Text,se);
    be.WriteBuffer(ss.DataString[1],ss.Size);
    be.Flush;
    sTemp:=se.DataString;
    Memo1.Text:=se.DataString;
    be.free;
  finally
    ss.Free;
    se.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var bd : TBlowFishDeCryptStream;
    tmp : string;
    se : TStringStream;
begin
  try
    se := TStringStream.Create(sTemp);
    bd := TBlowFishDeCryptStream.Create(Edit1.Text,se);
    SetLength(tmp,bd.Size);
    bd.Read(tmp[1],bd.Size);
    Memo1.Text:=tmp;

    bd.free;
  finally
  end;


Теперь надо разобраться с тем как использовать readbuffer

Добавлено спустя 14 минут 57 секунд:
Шифрование файла еще не сделал, но вот с буфером работа:

Код: Выделить всё
var
  Form1: TForm1;
  sTemp : ansistring;
  lentmp : integer;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var be : TBlowFishEncryptStream;
    se : TStringStream;
    tmp : ansistring;
begin
  try
    se := TStringStream.Create('');//куда пойдут шифрованные данные
    tmp:=Edit1.Text;//ключ
    be := TBlowFishEncryptStream.Create(tmp,se);
    tmp:='4 15.02.2017 05:26:17 NT';//данные которые шифруем
    lentmp:=Length(tmp);
    be.WriteBuffer(tmp[1],length(tmp));//пишем в поток
    be.Flush;//финализируем
    sTemp:=se.DataString;
    Memo1.Text:=se.DataString;
    be.free;
  finally
    se.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var bd : TBlowFishDeCryptStream;
    tmp : ansistring;
    se : TStringStream;
begin
  try
    se := TStringStream.Create(sTemp);//шифрованная строка
    tmp:=Edit1.Text;//ключ
    bd := TBlowFishDeCryptStream.Create(tmp,se);//дешифруем
    if Assigned(bd) then begin
      tmp:='';
      SetLength(tmp,bd.Source.Size);//размер буфера под расшифрованные данные
      bd.ReadBuffer(tmp[1],bd.Source.Size);//считываем
      Memo1.Text:=tmp;
    end;
    bd.free;
  finally
    se.Free;
  end;
end;


Добавлено спустя 26 минут 11 секунд:
Шифрование файла:

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var be : TBlowFishEncryptStream;
    fSource  : TFileStream;//файл источник
    fEncrypt : TFileStream;//файл шифрованный
    tmp : array of byte;
begin
  try
    fSource := TFileStream.Create(FileNameEdit1.FileName,fmOpenRead);//файл который шифруем
    fSource.Seek(0,soBeginning);
    fEncrypt := TFileStream.Create(FileNameEdit2.FileName,fmCreate or fmOpenWrite);//файл куда шифруем
    setlength(tmp,fSource.Size);
    fSource.ReadBuffer(tmp[0],fSource.Size);//считываем данные в буфер
    be := TBlowFishEncryptStream.Create(Edit1.Text,fEncrypt);
    be.WriteBuffer(tmp[0],length(tmp));//шифруем
    be.Flush;//финализируем
    be.free;
    setlength(tmp,0);
  finally
    fSource.Free;
    fEncrypt.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var bd : TBlowFishDeCryptStream;
    tmp : array of byte;
    fDecrypt : TFileStream;//файл, куда расшифровываем
    fEncrypt : TFileStream;//файл шифрованный
begin
  try
    fEncrypt := TFileStream.Create(FileNameEdit2.FileName,fmOpenRead);//шифрованный файл
    fDecrypt := TFileStream.Create(FileNameEdit3.FileName,fmCreate or fmOpenWrite);//расшифрованный файл
    bd := TBlowFishDeCryptStream.Create(Edit1.Text,fEncrypt);//дешифруем
    setlength(tmp,bd.Source.Size);
    bd.ReadBuffer(tmp[0],bd.Source.Size);//считываем расшифрованные данные в буфер
    fDecrypt.WriteBuffer(tmp[0],bd.Source.Size);//пишем в файл
    bd.free;
    setlength(tmp,0);
  finally
    fEncrypt.Free;
    fDecrypt.Free;
  end;
end;

tryexceptend
незнакомец
 
Сообщения: 4
Зарегистрирован: 14.04.2014 23:11:04


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 30

Рейтинг@Mail.ru