У меня есть мобильный клиент, разработанный в Dart, который отправляет запросы в API .NET CORE REST.Мне нужно AES зашифровать учетные данные следующим образом: зашифровать учетные данные пользователя json в Dart с помощью AES, затем отправить запрос в .NET CORE REST API, а затем расшифровать его.
Даже если я использую тот же ключ нас обеих сторон и с одним и тем же вектором инициализации, я получаю следующее исключение на стороне сервера: System.Security.Cryptography.CryptographicException: входные данные не являются полным блоком.
Я использую .NET CORE 2.2.203, и Dart 2.3.0.
Итак, это шифрование на стороне клиента Dart:
final key = encrypt.Key.fromUtf8('OkREB8tVlnYc0kDmtEE5v33zSP1wP8eB');
final iv = encrypt.IV.fromUtf8('HR92pIjHRe2pIj12');
final encrypter = encrypt.Encrypter(encrypt.AES(key));
final encrypted = encrypter.encrypt(**asd**, iv: iv);
Для строки asd она генерирует это:
X2C+xO2+aKhoITDNEBCHWg==
Я использую эту расшифровку в .NET CORE REST API:
public static string DecryptStringFromBytes_Aes(byte[] cipherText, byte[] Key, byte[] IV)
{
string plaintext = null;
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = Key;
aesAlg.IV = IV;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
plaintext = srDecrypt.ReadToEnd();
}
}
}
}
return plaintext;
}
И я вызываю его с такими параметрами (первый параметр - это зашифрованный на стороне клиента json)
DecryptStringFromBytes_Aes(
(Encoding.ASCII.GetBytes("X2C+xO2+aKhoITDNEBCHWg==")),
(Encoding.ASCII.GetBytes("OkREB8tVlnYc0kDmtEE5v33zSP1wP8eB")),
(Encoding.ASCII.GetBytes("HR92pIjHRe2pIj12"))
);
Однако произойдет сбой с этим исключением:
System.Security.Cryptography.CryptographicException: The input data is not a complete block.
Так что я хотел бы видеть на стороне сервера строку asd .