Ein IV := 'DLX' könnte dann crashen.
Nee, aber ein Key := 'DLX', da braucht man die 16bytes. IV kann auch '' sein.
Sehe ich anders:
Bezüglich Schlüssel:
Delphi-Quellcode:
procedure TDCP_rijndael.InitKey(const Key; Size: longword);
var
KC, ROUNDS, j, r, t, rconpointer: longword;
tk: array[0..MAXKC-1,0..3] of byte;
begin
Size:= Size div 8;
FillChar(tk,Sizeof(tk),0);
Move(Key,tk,Size);
if Size<= 16 then
begin
KC:= 4;
Rounds:= 10;
end
else if Size<= 24 then
begin
KC:= 6;
Rounds:= 12;
end
else
begin
KC:= 8;
Rounds:= 14;
end;
und bei den IVs
Delphi-Quellcode:
procedure TDCP_blockcipher128.SetIV(const Value);
begin
if not fInitialized then
raise EDCP_blockcipher.Create('Cipher not initialized');
Move(Value,IV,16);
Reset;
end;
bzw
Delphi-Quellcode:
procedure TDCP_blockcipher128.Init(const Key; Size: longword; InitVector: pointer);
begin
inherited Init(Key,Size,InitVector);
InitKey(Key,Size);
if InitVector= nil then
begin
FillChar(IV,16,{$IFDEF DCP1COMPAT}$FF{$ELSE}0{$ENDIF});
EncryptECB(IV,IV);
Reset;
end
else
begin
Move(InitVector^,IV,16);
Reset;
end;
end;
Du kannst also einen nil-pointer übergeben, es werden dann 16 Bytes 0 verwendet (DLX := '' ist wie nil-pointer), aber ansonsten werden mit dem move immer 16 Bytes benötigt. (Es muß aber nicht zum Crash kommen, je nach Speicherlage). Wenn's nicht crasht können durch Zufallsbelegungen unterschiedlich IVs entstehen, und das Ergebnis ist fehlerhaft.
Debugger für IV := '1';
Encrypt-IV: ( 49, 0, 0, 0, 50, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0)
Decrypt-IV: ( 49, 0, 0, 0, 4, 22, 70, 0, 216, 31, 186, 1, 224, 50, 0, 0)
Die 49 entsprechen '1' der Rest ist mehr oder weniger Zufall.