Форум: "Основная";
Текущий архив: 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