Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi AES mit Delphi und Java (https://www.delphipraxis.net/181307-aes-mit-delphi-und-java.html)

o-sch 5. Aug 2014 06:35


AES mit Delphi und Java
 
Hallo,

ich verwenden TPLockbox3 unter Delphi XE2 mit dem folgendem Code um einen Text zu verschlüssen:

Code:
const _MyMasterKey : UTF8String = '12345678901234567890123456789012';

function MyASE128.EnCrypt(aStr: string): string;
var base64Ciphertext:AnsiString;
    Codec: TCodec;
    CryptographicLibrary1: TCryptographicLibrary;
begin
  Result := '';
  CryptographicLibrary1 := TCryptographicLibrary.Create(Self);
  Codec := TCodec.Create(Self);
  Codec.CryptoLibrary := CryptographicLibrary1;
  Codec.ChainModeId := ChainIds[0]; // ECB
  Codec.StreamCipherId := BlockCipher_ProgId; // BlockMode
  Codec.BlockCipherId := CipherIds[0]; // AES-128
  try
    codec.Password := Copy(_MyMasterKey,0,16);
    codec.EncryptString( FixCipherBlockLength(aStr), base64Ciphertext);
    result := base64Ciphertext;
  finally
    Codec.CryptoLibrary := NIL;
    CryptographicLibrary1.Free;
    Codec.Free;
  end;
end;

function MyASE128.FixCipherBlockLength(aStr: string): string;
var rest:integer;
begin
  Result := aStr;
  rest := Length(aStr) mod 16;
  if rest <> 0 then
  begin
    Result := Result + DupeString(' ', 16-rest);
  end;
end;
Eine endsprechende DeCrypt Funktion läuft in Delphi einwandfrei.

Nun möchte ich die Entschlüsselung auch unter Java implementieren.
Dazu habe ich folgenden Code gebastelt:

Code:
    public static String _MyMasterKey = "12345678901234567890123456789012";

    public static String MyDecrypt(String CryptText) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException {
       
      String encryptedMessage = CryptText;
      byte[] keyByteArray = _MyMasterKey.getBytes(Charset.forName("UTF-8"));
      keyByteArray = Arrays.copyOf(keyByteArray, 16);
     
      SecretKeySpec skeySpec = new SecretKeySpec(keyByteArray, "AES");    
      Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");

      cipher.init(Cipher.DECRYPT_MODE, skeySpec);
     
      byte[] msgByteArray = encryptedMessage.getBytes(Charset.forName("UTF-8"));
     
      String originalMessage = new String(cipher.doFinal( msgByteArray ));
      System.out.printf("Original Text: %s\n", originalMessage);
      return originalMessage;
       
    }
Leider funktioniert die Sache nicht. Es kommt nicht der ursprüngliche Text zurück.
Kann mir jemand einen Tipp geben wie ich das Problem lösen kann ?

gammatester 5. Aug 2014 08:05

AW: ASE mit Delphi und Java
 
Die Standardfrage lautet: Warum wird schon wieder mit Strings gearbeitet? Und dann auch noch als Schlüssel!?

Vorschlag zum Fixing: Benutze erst einmal direkt ein array[0..15] of byte statt Strings. Dann kannst Du zumindest sicher sein, daß der gleiche Schlüssel verwendet wird.

Und später kann man den Rest debuggen, und eventuell aus Passwörtern mit PKDF2 oder BCrypt die Schlüsselbytes erzeugen.

Wenn die Schlüsellbytes identisch sind, können allerdings weitere Probleme mit unterschiedlichen Betriebsmodi und Paddingvarianten auftauchen. In Delphi wird zwar kommentar-mäßig ECB (und ein Blockmode???) erwähnt, aber sonst kann ich in beiden Sprachen keine Hinweise darauf entdecken.

Puke 5. Aug 2014 09:20

AW: ASE mit Delphi und Java
 
Was is denn ASE?
  • American Society of Echocardiography
  • Alliance to Save Enery
  • American Stock Exchange
Oder meintest du etwa den Rijndael-Algorithmus, der von der NIST 2001 zum Advanced Encryption Standard, kurz AES, gewählt wurde? Außerdem benutze das nächste Mal Delphi-Code-Tags.

Außerdem muss ich gammatester Recht geben. Es ist ein Wunder, dass dieser Code funktioniert. Ansonsten kann bei einem ECB nicht sonderlich viel schiefgehen. Mir fällt eigentlich nur die Schlüssel-Erweiterung ein, weil die nicht durch das NIST vereinheitlicht wurde. Außerdem wird beim Rijndael anders erweitert, als beim DES.

Ich bezweifel aber sehr dass es daran liegt ...

Gruß
Puke

o-sch 5. Aug 2014 10:17

AW: AES mit Delphi und Java
 
Danke für Eure Ratschläge, ich werde den Code entsprechend umbauen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz