Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: DEC 5.1: Problem bei sprachübergreifender Verwendung von

  Alt 10. Feb 2008, 23:19
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
  Mit Zitat antworten Zitat