Главная страница
    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.039 c
1-1110971671
aleshap
2005-03-16 14:14
2005.03.27
Event OnEnter


4-1108496540
Коля
2005-02-15 22:42
2005.03.27
Как програмно убрать "Только чтение" в свойствах файла?


1-1110384086
grusty
2005-03-09 19:01
2005.03.27
Как выполнить процедуру другого окна текущего приложения...


1-1110719969
Victor08
2005-03-13 16:19
2005.03.27
Маска целых чисел


1-1110517914
seregka
2005-03-11 08:11
2005.03.27
Сохранение изменений в готовом exe





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский