Actually the code I came up with looks remarkably like the answer that was given many moons ago by @jshand2010.
I also noticed that the blowfish unit is architecturally not very sound, but works.
Compilable example follows later today.In honour of the correct answer by @jshand2010 translated into working example

and in the presence of sheer laziness:
{$mode delphi}{$H+}
uses classes, blowfish;
function encrypt(s: string): string; //note you may need to use a try...finally...end; statement
var
bf:TBlowfishEncryptStream = nil;
s1, s2: TStringStream;
begin
Result := '';
if (s<>'') then
begin
s1:=TStringStream.Create(s); //used as your source string
s2:=TStringStream.Create(''); //make sure destination stream is blank
bf:=TBlowfishEncryptStream.Create('password', s2); //writes to destination stream
bf.copyfrom(s1, s1.size);
bf.free;
result:=s2.datastring;
s2.free;
s1.free;
end;
end;
// for decryption you just do the opposite like this:
function decrypt(s: string): string; //note you may need to use a try...finally...end; statement
var
bf:TBlowfishDecryptStream;
s1, s2: TStringStream;
begin
Result := '';
if (s<>'') then begin
s1:=TStringStream.Create(s); //used as your source string
s2:=TStringStream.Create(''); //make sure destination stream is blank
bf:=TBlowfishDecryptStream.Create('password', s1); //reads from source stream
s2.copyfrom(bf, s1.size); //to destination stream copy contents from bf to the size of source stream
bf.free;
result:=s2.datastring;
s2.free;
s1.free;
end;
end;
var
s:String = 'Whatever' ;
begin
s:= encrypt(s);
writeln(s);
s:= decrypt(s);
writeln(s);
end.
You could have done that too.... No Base64 anywhere.
I expect
YOU to lift out the password into a parameter, which I did, but the answer from 12.5 years ago was already correct.
Hence I repeated it, because I am not blind yet.

: I
read the thread....
I left in all original code without change, including the comments. Just made it compile for the lazy.