Мне нужна помощь в решении проблемы с использованием библиотеки Lazarus FPC Blowfish.

Я уже давно использую библиотеку Lazarus/FPC Blowfish для шифрования файловых потоков, и она работает очень хорошо.

Теперь я попытался адаптировать библиотеку для шифрования и дешифрования произвольных структур памяти (записей, а также строк) и получил проблему, которую я не мог решить в течение нескольких дней, поэтому, пожалуйста, помогите.

Проблема в том, что строки, длина которых точно кратна размеру блока Blowfish (8 байт), шифруются и дешифруются правильно. Если строка не заканчивается точно на 8-байтовой границе, символы, превышающие границу, искажаются.

Вот код (для полного проекта Lazarus перейдите по ссылке)

Ссылка на ZIP-файл проекта Lazarus

Procedure BlowfishEncrypt(var Contents;ContentsLength:Integer;var Key:String);

// chop Contents into 64 bit blocks and encrypt using key

var
  arrShadowContent:Array of Byte absolute Contents;
  objBlowfish: TBlowFish;
  BlowfishBlock: TBFBlock;
  ptrBlowfishKey:PBlowFishKey;
  p1,count,maxP:integer;

begin
  ptrBlowfishKey := addr(Key[1]);
  objBlowfish := TBlowFish.Create(ptrBlowfishKey^,Length(Key));
  p1 := 0;
  maxP := ContentsLength - 1;
  count := SizeOf(BlowfishBlock);
  while p1 < maxP do
     begin
     fillChar(BlowfishBlock,SizeOf(BlowfishBlock),0); // only for debugging
     if p1 + count > maxP then
        count := ContentsLength - p1;
     Move(arrShadowContent[p1],BlowfishBlock,count);
     objBlowfish.Encrypt(BlowfishBlock);
     Move(BlowfishBlock,arrShadowContent[p1],count);
     p1 := p1 + count;
     end;
  FreeAndNil(objBlowfish);
end;

И это звонок...

procedure TForm1.CryptButtonClick(Sender: TObject);

var
  ContentsBuffer,Key:String;

begin
ContentsBuffer := PlainTextEdit.Text;
Key := KeyTextEdit.Text;
BlowFishEncrypt(ContentsBuffer,Length(ContentsBuffer),Key);
CryptOutEdit.Text := ContentsBuffer;
BlowFishDecrypt(ContentsBuffer,Length(ContentsBuffer),Key);
CryptCheckEdit.Text := ContentsBuffer;
end; 

И вот вы видите, что происходит:

Скриншот тестового пользовательского интерфейса


person Nimral    schedule 23.03.2021    source источник


Ответы (1)


Решено. Проблема в том, что мне не разрешено обрезать TBFBlock. Для работы Blowfish Decryption ContetLength должен быть кратен размеру TBFBlock.

person Nimral    schedule 24.03.2021