Hm, jo das nächste Problem. JAVA wird wohl an die Daten soviele Bytes dranhängen bis die geamte Nachricht ein Vilefaches von 8 oder 16 Bytes ist. Das dafür benutzte Padding Schemata kann sehr unterschiedlich sein. Da musst du mal in den JAVA Helpfiles stöbern.
DEC paddet nur wenn die Nachricht in der Anzahl der Bytes nicht ohne Rest durch Cipher.BlockSize teilbar ist. Der letzte unvollständige Datenblock von X = Nachrichtenlänge modulo Cipher.BlockSize wird dann im cmCBC8 Modus verschlüsselt, Also das ist wie cmCBCx, wobei dieser CBC immer auf Blöcken von Cipher.BlockSize Bytes arbeitet. der cmCBC8 Modus arbeitet mit einem Feedback von 8 Bit = 1 Byte. Somit sind cmCBCx und cmCBC8 von iherer Funktionerweise identisch nur das sich die Datenbreite des Feeebackregisters verändert. Einmal ist es Cipher.BlockSize Bytes und das anderes mal ist es 1 Byte. Dieses Padding ist einfach, führt zu keiner Nachrichtenexpansion, simpel zu implementieren da meistens sowieso beide Feedbackgrößen unterstützt werden und es ist kryptogaphisch sicherer als viel der anderen Paddingschematas.
Du kannst also folgendes machen
1.) verschlüssel die Nachricht soweit bis alle Datenblöcke a Cipher.BlockSize verarbeitet sind
2.) den Rest der Nachricht in temp. Buffer kopieren und mit zusätzlichen Bytes am Ende expandieren, je nach Padding Schemata
3.) diesen Block weiterverschlüsseln und an die verschlüsselten Daten dranhängen
Du kannst weiterhin mit Cipher.EncodeStream(), .EncodeBinary() und .Encode() arbeiten. Nur musst du es zweimal aufrufen. Also so
Delphi-Quellcode:
var
Remain,I: Integer;
Buffer: array of Byte;
begin
with TCipher.Create do
try
Mode := cmCBCx;
Init(Password, SizeOf(Password), InitVector);
Remain := Source.Size mod Context.BlockSize;
EncodeStream(Source, Dest, Source.Size - Remain);
if Remain > 0 then
begin // Padding nach alter Methode
SetLength(Buffer, Context.BlockSize);
Source.ReadBuffer(Buffer[0], Remain);
for I := Remain to High(Buffer) do
Buffer[I] := I; // je nach Padding Schema befüllen
Encode(Buffer[0], Buffer[0], Length(Buffer));
Dest.WriteBuffer(Buffer[0], Length(Buffer));
end;
finally
Free;
end;
end;
Gruß Hagen