Einzelnen Beitrag anzeigen

Eldarion

Registriert seit: 24. Jan 2011
9 Beiträge
 
#6

AW: Entschlüsseln einer Datei (DEC) mit Java problematisch

  Alt 24. Jan 2011, 12:34
Ist eine der berühmt/berüchtigten proprietären Verschlüsselungsmethoden:

cmCBCx = Cipher Block Chainung, with CFB8 padding of truncated final block

Das muss dementsprechend in Java nachgebildet werden; bzw. wenn Du ohne einen letzten unvollständigen Block leben kannst, schneide den Schüsseltext auf Vielfache von 16 Bytes ab und benutze Standard-CBC.
Was genau meinst du mit: wenn ich ohne einen letzten unvollständigen Block leben kann? Ich kenn leider auch die Verschlüsselungen nicht, also verstehe ich NOCH Bahnhof

Schlag mich grad mit der Cipher API von Java rum. Gibts da nicht schon was fertiges?

Und wenn ich es richtig sehe, dann wird ja das Passwort mit KDFx verschlüsselt und vorne in die Datei geschrieben. Benötige ich diese Information dann überhaupt, wenn ich das Passwort eh schon kenne?

Also ich kann mir gerade auch noch nicht den Aufbau einer solch verschlüsselten Datei vorstellen. Läuft das dann in etwa so:
/Modus/ /Passwort/ /Der Seed mit dem das Passwort verschlüsselt ist/ /Der verschlüsselte Inhalt/

Oder steht zum Schluss nur der verschlüsselte Inhalt in der Datei?

*Edit: Ich füge euch mal den Quellcode an der Verschlüsselung. Vielleicht hilft der ja weiter.
Delphi-Quellcode:
 var
  ACipherClass: TDECCipherClass = TCipher_Rijndael;
  ACipherMode: TCipherMode = cmCBCx;
  AHashClass: TDECHashClass = THash_Whirlpool;
  ATextFormat: TDECFormatClass = TFormat_Mime64;
  AKDFIndex: LongWord = 1;

function ZipEncodeFileStream(const AFileStream: TMemoryStream; const APassword: Binary;
                             ACipher: TDECCipherClass = nil; AMode: TCipherMode = cmCTSx;
                             AHash: TDECHashClass = nil) : TMemoryStream;
  procedure Write(const Value; Size: Integer);
  begin
    Result.WriteBuffer(Value, Size);
  end;

  procedure WriteByte(Value: Byte);
  begin
    Write(Value, SizeOf(Value));
  end;

  procedure WriteLong(Value: LongWord);
  begin
    Value := SwapLong(Value);
    Write(Value, SizeOf(Value));
  end;

  procedure WriteBinary(const Value: Binary);
  begin
    WriteByte(Length(Value));
    Write(Value[1], Length(Value));
  end;

var
  Seed: Binary;
  i : integer;
  aZip : TVCLZip;
begin
  aZip := TVCLZip.Create(nil);
  Result := TMemoryStream.Create;
  Result.Clear;
  Result.Position := 0;
  AFileStream.Position := 0;
  ACipher := ValidCipher(ACipher);
  AHash := ValidHash(AHash);
  Seed := RandomBinary(16);

  with ACipher.Create do
  try
    Mode := AMode;
    Init(AHash.KDFx(APassword, Seed, Context.KeySize));

    WriteLong(Identity);
    WriteByte(Byte(Mode));
    WriteLong(AHash.Identity);
    WriteBinary(Seed);
    WriteLong(AFileStream.Size);
    EncodeStream(AFileStream, Result, AFileStream.Size);
    WriteBinary(CalcMAC);
  finally
    Free;
  end;
  ProtectStream(AFileStream);
  AFileStream.Clear;
  Result.Position := 0;
  AFileStream.CopyFrom(Result,Result.Size);
  Result.Clear;
  AFileStream.Position := 0;
  aZip.PackLevel := 9;
  aZip.ZLibCompressStream(AFileStream,Result);
  aZip.Free;
end;

Geändert von Eldarion (24. Jan 2011 um 12:53 Uhr)
  Mit Zitat antworten Zitat