Die AES-Entschlüsselung schlägt mit dem Fehler „Padding ist ungültig“ fehl, wenn vom Android-Client verschlüsselte DatenC#

Ein Treffpunkt für C#-Programmierer
Guest
 Die AES-Entschlüsselung schlägt mit dem Fehler „Padding ist ungültig“ fehl, wenn vom Android-Client verschlüsselte Daten

Post by Guest »

Ich versuche, Daten auf einem C#-Server zu entschlüsseln, die von einem Android-Client mit AES-Verschlüsselung verschlüsselt wurden. Während der Entschlüsselung erhalte ich jedoch den Fehler „System.Security.Cryptography.CryptographicException: Padding ist ungültig und kann nicht entfernt werden“. Ich vermute, dass das Problem mit der Handhabung des IV (Initialisierungsvektor) zusammenhängt, bin mir aber nicht sicher, wie ich es beheben kann.
Android-VerschlüsselungslogikHier ist die Verschlüsselungslogik des Android-Clients:

Code: Select all

object AESHelper {
fun encrypt(data: String, sharedSecret: ByteArray): String {
val cipher = Cipher.getInstance("AES/CBC/PKCS7Padding")
val secretKeySpec = SecretKeySpec(sharedSecret, "AES")
val iv = ByteArray(16) // Zero IV
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, IvParameterSpec(iv))
val encryptedBytes = cipher.doFinal(Base64.decode(data, Base64.NO_WRAP))
return Base64.encodeToString(encryptedBytes, Base64.NO_WRAP).trim()
}
}
Der Android-Client verwendet:
AES-Verschlüsselung im CBC-Modus.
PKCS7-Padding.
Eine 16-Byte-Null-IV (Initialisierungsvektor gefüllt mit Nullen).
Die IV wird dem Chiffretext nicht vorangestellt.
C#-Entschlüsselungslogik
Hier ist meine aktuelle C#-Entschlüsselungslogik:

Code: Select all

public static string Decrypt(string cipherText, byte[] sharedSecret)
{
using var aes = new AesCryptoServiceProvider { Key = sharedSecret };
var cipherBytes = Convert.FromBase64String(cipherText);

var iv = new byte[aes.BlockSize / 8];
var encryptedBytes = new byte[cipherBytes.Length - iv.Length];
Buffer.BlockCopy(cipherBytes, 0, iv, 0, iv.Length);
Buffer.BlockCopy(cipherBytes, iv.Length, encryptedBytes, 0, encryptedBytes.Length);

aes.IV = iv;

using var decryptor = aes.CreateDecryptor();
var decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
return Encoding.UTF8.GetString(decryptedBytes);
}
Problem
Wenn ich versuche, den vom Android-Client generierten Chiffretext zu entschlüsseln, erhalte ich die folgende Fehlermeldung:

System.Security.Cryptography.CryptographicException: Padding ist
ungültig und kann nicht entfernt werden. at
Internal.Cryptography.UniversalCryptoDecryptor.DepadBlock(Byte[]
block, Int32-Offset, Int32-Anzahl) at
Internal.Cryptography.UniversalCryptoDecryptor.UncheckedTransformFinalBlock(Byte[]
inputBuffer, Int32 inputOffset, Int32 inputCount) bei
Internal.Cryptography.UniversalCryptoTransform.TransformFinalBlock(Byte[]
inputBuffer, Int32 inputOffset, Int32 inputCount) bei
MyNamespace.Decrypt(String cipherText, Byte[] sharedSecret) Was ich habe
Ich habe versucht, die C#-Entschlüsselungslogik so zu aktualisieren, dass stattdessen ein Null-IV (16-Byte
Array gefüllt mit Nullen) verwendet wird des

Extrahierens der IV aus dem Chiffretext:
Ich habe bestätigt, dass der Android-Client die IV nicht voranstellt der Chiffretext.
Fragen
Warum erhalte ich immer noch die Fehlermeldung „Auffüllung ist ungültig“, selbst nachdem ich eine Null-IV verwendet habe?
Ist da etwas? Ansonsten muss ich die C#-Entschlüsselungslogik ändern, um sie an Android anzupassen Verschlüsselungslogik des Clients?
Gibt es weitere Schritte, die ich unternehmen sollte, um dieses Problem zu beheben?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post