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()
}
}
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);
}
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?