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
Hallo neo,
prüf mal ob es an der Byte-Reihenfolge liegen kann. Eventuell beim Encoden des Strings.
André
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).
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
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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