Laden...

[erledigt] Ergebnis AES Verschlüsselung in C# nicht gleich Java

Erstellt von *neo* vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.167 Views
*
*neo* Themenstarter:in
299 Beiträge seit 2006
vor 10 Jahren
[erledigt] Ergebnis AES Verschlüsselung in C# nicht gleich Java

Hallo zusammen,

ich habe folgenden Code in Java


public AESCrypt(String key) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        digest.update(key.getBytes("UTF-8"));
        byte[] keyBytes = new byte[32];
        System.arraycopy(digest.digest(), 0, keyBytes, 0, keyBytes.length);

        cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
        AlgorithmParameterSpec spec = getIV();
    }

public AlgorithmParameterSpec getIV() {
        byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
        IvParameterSpec ivParameterSpec;
        ivParameterSpec = new IvParameterSpec(iv);

        return ivParameterSpec;
    }

    public String encrypt(String plainText) throws Exception {
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, spec);
        byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
        String encryptedText = new String(Base64.encode(encrypted, Base64.DEFAULT), "UTF-8");

        return encryptedText;
    }

in C# folgendes:


RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;

rijndaelCipher.KeySize = 128;
rijndaelCipher.BlockSize = 128;

HashAlgorithm sha = new SHA256Managed();
byte[] pwdBytes = Encoding.UTF8.GetBytes(key);
byte[] test = sha.ComputeHash(pwdBytes);

byte[] keyBytes = new byte[32];

Array.Copy(test, keyBytes, Math.Min(keyBytes.Length, pwdBytes.Length));
rijndaelCipher.Key = keyBytes;
byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
rijndaelCipher.IV = iv;
ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
byte[] plainText = Encoding.UTF8.GetBytes(textToEncrypt);

return Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length));

unter Java bekomme ich folgenden base64 String raus:
PrbaDKPFyLNzBA6LtCnx/w==

und unter c#:
zvDdhGAn7D+Ahs6IWKowAg==

Ich verstehe nicht woran es liegt.
Zur Info in PHP habe ich auch den base64 String PrbaDKPFyLNzBA6LtCnx/w== herrausbekommen. In C# fehlt etwas oder ist falsch.

Danke für eure Hilfe

Z
403 Beiträge seit 2007
vor 10 Jahren

Hallo neo,

prüf mal ob es an der Byte-Reihenfolge liegen kann. Eventuell beim Encoden des Strings.

André

656 Beiträge seit 2008
vor 10 Jahren

Ohne mich jetzt im Detail mit dem AES selber zu befassen: Sollte das Math.Min im Array.Copy genau so aussehen? Auf die schnelle schreit es danach, zu wenige Bytes zu kopieren (was den Unterschied erklären würde).

16.835 Beiträge seit 2008
vor 10 Jahren

Ich meine, dass das Unterschiede beim Padding oder KeyLength waren.
In meiner Favouriten-Sammlung (wobei der auch schon fast 4 Jahre alt ist, keine Ahnung, was sich da geändert hat) habe ich zB folgenden Link: AES verschlüsselte Daten zwischen PHP, .net und Java austauschen

*
*neo* Themenstarter:in
299 Beiträge seit 2006
vor 10 Jahren

Hallo Abt,

vielen, vielen dank für deinen Link. hat mir super geholfen. Anbei noch die encrypt methode in Java:



cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
secretKeySpec = new SecretKeySpec(key.getBytes(), "AES");
algorithmParameterSpec = new IvParameterSpec(iv.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, algorithmParameterSpec);
byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));
return new String(Base64.encode(encrypted, Base64.DEFAULT), "UTF-8");

Grüße