Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

Stream/BlowFish-TurboPower   Найти похожие ветки 

 
markers ©   (2005-03-10 18:02) [0]

Здрасте;)
имеется проблимс
Function EncListToDecList(Const InputList:TStringList;Out OutputList:TStringList; Pass:String):Boolean;
procedure EncodeStream(const InputStream: TStringStream;Out OutPutStream:TStringStream; PassE:String);
 var key128: TKey128;
 begin
  GenerateLMDKey(Key128, SizeOf(Key128), PassE);
  BFEncryptStreamCBC(InputStream,OutPutStream,key128,False);
 end;

var
InS, OutS : TStringStream;
begin
Result:=False;
InS := TStringStream.Create("");
OutS := TStringStream.Create("");
try
 InputList.SaveToStream(InS);
 EncodeStream(InS, OutS, Pass); //Перекодировка (Расшифрование)
 OutputList.LoadFromStream(OutS);
 Result:=True;
finally
 InS.Destroy;
 OutS.Destroy;
end;
end;

Данный код получает стринг лист конвертирует его в стрим, потом дешифрует и опять сохраняет в стрим, но почему-то срабатывает исключение в процедуре BFEncryptStreamCBC(InputStream,OutPutStream,key128,False);
Листинг этой процедуры
procedure BFEncryptStreamCBC(InStream, OutStream : TStream;
           const Key : TKey128; Encrypt : Boolean);
var
 I : LongInt;
 Block : TBFBlock;
 IV : TBFBlock;
 Work : TBFBlock;
 Context : TBFContext;
 BlockCount : LongInt;
{$IFDEF LINUX}
 fd : pIOFile;
{$ENDIF}
begin
 InitEncryptBF(Key, Context);

 {get the number of blocks in the file}
 BlockCount := (InStream.Size div SizeOf(Block));

 if Encrypt then begin
   {set up an initialization vector (IV)}
{$IFDEF MSWINDOWS}
   Block[0] := timeGetTime;
   Block[1] := timeGetTime;
{$ENDIF}
{$IFDEF LINUX}
   fd := fopen( "/dev/random", "r" );
   fread( @Block[0], SizeOf( byte ), SizeOf( Block[0] ), fd );
   fread( @Block[1], SizeOf( byte ), SizeOf( Block[1] ), fd );
   fclose( fd );
{$ENDIF}
   EncryptBF(Context, Block, Encrypt);
   OutStream.Write(Block, SizeOf(Block));
   IV := Block;
 end else begin
   {read the frist block to prime the IV}
   InStream.Read(Block, SizeOf(Block));
   Dec(BlockCount);
   IV := Block;
 end;

 {when encrypting, make sure we have a block with at least one free}
 {byte at the end. used to store the odd byte count value}
 if Encrypt then
   Inc(BlockCount);

 {process all except the last block}
 for I := 1 to BlockCount - 1 do begin
   if InStream.Read(Block, SizeOf(Block)) <> SizeOf(Block) then
     raise ECipherException.Create(SInvalidFileFormat); <Срабатывает это исключение и все подобные в коде ниже...

   if Encrypt then begin
     EncryptBFCBC(Context, IV, Block, Encrypt);
     IV := Block;
   end else begin
     Work := Block;
     EncryptBFCBC(Context, IV, Block, Encrypt);
     IV := Work;
   end;

   OutStream.Write(Block, SizeOf(Block));

   if Assigned(LbOnProgress) then                                              {!!.06a}
     if InStream.Position mod LbProgressSize = 0 then                          {!!.06a}
       LbOnProgress (InStream.Position, InStream.Size);                        {!!.06a}
 end;

 if Encrypt then begin
   FillChar(Block, SizeOf(Block), #0);

   {set actual number of bytes to read}
   I := (InStream.Size mod SizeOf(Block));
   if InStream.Read(Block, I) <> I then
     raise ECipherException.Create(SInvalidFileFormat);

   {store number of bytes as last byte in last block}
   PByteArray(@Block)^[SizeOf(Block)-1] := I;

   {encrypt and save full block}
   EncryptBFCBC(Context, IV, Block, Encrypt);
   OutStream.Write(Block, SizeOf(Block));
 end else begin
   {encrypted file is always a multiple of the block size}
   if InStream.Read(Block, SizeOf(Block)) <> SizeOf(Block) then
     raise ECipherException.Create(SInvalidFileFormat);
   EncryptBFCBC(Context, IV, Block, Encrypt);

   {get actual number of bytes encoded}
   I := PByteArray(@Block)^[SizeOf(Block)-1];

   {save valid portion of block}
   OutStream.Write(Block, I);
 end;
 if Assigned(LbOnProgress) then                                                {!!.06a}
   LbOnProgress (InStream.Position, InStream.Size);                            {!!.06a}
end;

В чём загвостка?
Спасибо!


 
markers ©   (2005-03-10 18:06) [1]

Стоит TStringStream вместо оригинального TMemoryStream в качестве поиска проблемы.
Проверял размер стрима после конвертации получается примерно на 1 символ больше, может в этом проблема? Только тогда почему и как её решить?


 
markers ©   (2005-03-10 18:42) [2]

Всё! Как пелось В. Высоцким "А ответ безумно прост и ответ единственны";) Просто нужно было ресетить позицию после передёргивания стринга в стрим и перед передёргивания стрима в стринг.
Спасибки всем;)



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.032 c
14-1110348356
Ozone
2005-03-09 09:05
2005.03.27
Эффективность канала связи


1-1110777184
LEXX_55
2005-03-14 08:13
2005.03.27
Трей


1-1110439516
Эли
2005-03-10 10:25
2005.03.27
Чтобы можно было увидеть русские шрифты


1-1110881978
integery
2005-03-15 13:19
2005.03.27
как програмно узнать путь к файлу которий щас играєт winamp


9-1104933755
Trof
2005-01-05 17:02
2005.03.27
Glscene - вход в здания.