i have a problem with TBlowfishDecryptStream :

                        Try
                                lBuffer := TMemoryStream.Create;
                                lSource := (aObject As TMemoryStream);
                                lSource.Seek(0, soFromBeginning);
                                lCypher := TBlowfishDecryptStream.Create(fKey, 
lSource);
                                lBuffer.LoadFromStream(lCypher);
                        Except
                                On E: Exception Do
                                        WriteLn(E.ClassName, '->', E.Message);
                        End;

Spits out the "EBlowFishError" exception with "Seek not allowed on
encryption streams"

The problem is basically that TBlowfishDecryptStream does not allow to
use the "size" propertie, making it very hard to use it.

There are various ways to do this, for one :

                        Try
                                lBuffer := TMemoryStream.Create;
                                lSource := (aObject As TMemoryStream);
                                lSource.Seek(0, soFromBeginning);
                                lCypher := TBlowfishDecryptStream.Create(fKey, 
lSource);
                                lBuffer.CopyFrom(lCypher, lCypher.Size);
                        Except
                                On E: Exception Do
                                        WriteLn(E.ClassName, '->', E.Message);
                        End;

But this gives the exact same error,

the last one is this :

                        Try
                                lBuffer := TMemoryStream.Create;
                                lSource := (aObject As TMemoryStream);
                                lSource.Seek(0, soFromBeginning);
                                lCypher := TBlowfishDecryptStream.Create(fKey, 
lSource);
                                lBuffer.CopyFrom(lCypher, lSource.Size);
                        Except
                                On E: Exception Do
                                        WriteLn(E.ClassName, '->', E.Message);
                        End;

The problem now is that it eats chars at the end of the generated
lBuffer (tested by taking a tmemorystream thru tblowfishencryptstream,
then taking the result to this tblowfishdecryptstream, than back to a
tmemorystream and comparing the results, the original tmemorystream
shows to be bigger than the resulting tmemorystream)...

Basically i need :

1 - That TBlowfishEncryptStream guarantees that the same ammount of
bytes feed to it, ends up at the output of it
2 - That TBlowfishDecryptStream simply allows us to use Size property
(Well, sometimes i receive a tmemorystream in an unrelated part of the
code so i cannot read the original size the buffer had before
encrypting)...

Test case :

===== Test7.pas ======

Uses
        Classes,
        BlowFish;

Var
        lSource,
        lIntermediate,
        lDestination : TMemoryStream;
        lEncrypter : TBlowfishEncryptStream;
        lDecrypter : TBlowfishDecryptStream;

Begin
        lSource := TMemoryStream.Create;
        lIntermediate := TMemoryStream.Create;
        lDestination := TMemoryStream.Create;

        lSource.LoadFromFile('test7.pas');
        WriteLn(lSource.Size);
        
        lEncrypter := TBlowfishEncryptStream.Create('123', lIntermediate);
        lEncrypter.CopyFrom(lSource, lSource.Size);
        WriteLn(lIntermediate.Size);
        lIntermediate.Seek(0, soFromBeginning);

        lDecrypter := TBlowfishDecryptStream.Create('123', lIntermediate);
        lDestination.CopyFrom(lDecrypter, lSource.Size);
        
        WriteLn(lDestination.Size);
        
        lDestination.SaveToFile('test7.txt');
        
        lSource.Free;
        lIntermediate.Free;
        lDestination.Free;
End.
==== output =====

2147
2144
2144

IE : It misses 3 chars...
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to