Расшифровка AES завершается с ошибкой «Заполнение недействительно» при расшифровке данных, зашифрованных клиентом AndroiC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Расшифровка AES завершается с ошибкой «Заполнение недействительно» при расшифровке данных, зашифрованных клиентом Androi

Сообщение Anonymous »

Я пытаюсь расшифровать данные на сервере C#, которые были зашифрованы клиентом Android с использованием шифрования AES. Однако я столкнулся с ошибкой System.Security.Cryptography.CryptographicException: заполнение недопустимо и не может быть удалено во время расшифровки. Я подозреваю, что проблема связана с тем, как обрабатывается IV (вектор инициализации), но я не знаю, как ее исправить.
Логика шифрования 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()
}
}
Клиент Android использует:
шифрование 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»