Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.053 c
1-1110895989
Alex Romanskiy
2005-03-15 17:13
2005.03.27
Как уменьшить картинку.


4-1108114953
lifo
2005-02-11 12:42
2005.03.27
проблема с процедурой TimeProc при обьявлении ее в классе


3-1109234184
Shuma
2005-02-24 11:36
2005.03.27
Нужен компонент наследник от TDataSet


1-1110969733
Прогин
2005-03-16 13:42
2005.03.27
XML Mapping


14-1109939978
Sicilla
2005-03-04 15:39
2005.03.27
Adware





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский