Логика шифрования AndroidВот логика шифрования клиента Android:
Код: Выделить всё
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 в режиме CBC.
заполнение PKCS7. >
16-байтовый нулевой IV (вектор инициализации, заполненный нулями).
IV не добавляется в начало зашифрованного текста.
Логика расшифровки C#
Вот моя текущая логика дешифрования C#:
Код: Выделить всё
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);
}
Когда я пытаюсь расшифровать зашифрованный текст, сгенерированный клиентом Android, я получаю следующую ошибку:
System.Security.Cryptography.CryptographicException: заполнение
недопустимо и не может быть удалено. at
Internal.Cryptography.UniversalCryptoDecryptor.DepadBlock(Byte[]
блок, смещение Int32, счетчик Int32) at
Internal.Cryptography.UniversalCryptoDecryptor.UncheckedTransformFinalBlock(Byte[]
inputBuffer, Int32 inputOffset, Int32 inputCount) at
Internal.Cryptography.UniversalCryptoTransform.TransformFinalBlock(Byte[]
inputBuffer, Int32 inputOffset, Int32 inputCount) at
MyNamespace.Decrypt(String cipherText, Byte[] SharedSecret) Что я Пытался обновить логику дешифрования C#, чтобы использовать нулевой IV. (16-байтовый
массив, заполненный нулями) вместо
извлечения IV из зашифрованного текста:
Я подтвердил, что клиент Android не добавляет IV к зашифрованному тексту.
Вопросы
Почему я все еще получаю сообщение об ошибке «Заполнение неверно» даже после использования нулевого IV?
Есть ли что-нибудь еще мне нужно изменить в логике дешифрования C#, чтобы она соответствовала логике шифрования клиента Android?
Нужно ли предпринять какие-либо дополнительные действия для устранения этой проблемы?
Подробнее здесь: https://stackoverflow.com/questions/793 ... ata-encryp