Заполнение является недействительным и не может быть удалено во время расшифровки шифрования с использованием AES - PullRequest
0 голосов
/ 26 сентября 2019

Я работаю над шифрованием / дешифрованием AES.Я хочу зашифровать запрос из моего углового приложения и отправить его в .net api и расшифровать в api, затем зашифровать ответ со стороны api и отправить в угловое приложение и расшифровать с помощью AES.Но иногда это дает мне исключение «заполнение недопустимо и не может быть удалено» на стороне API.

Вот мой код криптографической службы машинописного текста:

aesEncrypt(keys: string, value: string) { // encrypt api request parameter with aes secretkey

    var key = CryptoJS.enc.Utf8.parse(keys);
    var iv = CryptoJS.enc.Utf8.parse(keys);
    var encrypted = CryptoJS.AES.encrypt(JSON.stringify(value), key,
        {
            keySize: 128 / 8,
            //keySize: 128,
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7,

        });

    return encrypted.toString();
}

aesDecrypt(keys: string, value: any) { // decrypt api response parameter with aes secretkey
    var key = CryptoJS.enc.Utf8.parse(keys);
    var iv = CryptoJS.enc.Utf8.parse(keys);
    var decrypted = CryptoJS.AES.decrypt(value, key, {
        keySize: 128 / 8,
        //keySize: 128,
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });

    return JSON.parse(decrypted.toString(CryptoJS.enc.Utf8));
}

Вот мой код крипто-фильтра API:

Путь 1:

public static string Encrypt(string key, string data)
{
    byte[] encryptedBytes = new UTF8Encoding().GetBytes(data);
    AesCryptoServiceProvider aes = AesCryptoServiceProvider(key);
    ICryptoTransform crypto = aes.CreateEncryptor(aes.Key, aes.IV);
    byte[] secret = crypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
    crypto.Dispose();
    return Convert.ToBase64String(secret);
}

public static string Decrypt(string key, string encrypted)
{
    byte[] encryptedBytes = Convert.FromBase64String(encrypted);
    AesCryptoServiceProvider aes = AesCryptoServiceProvider(key);
    ICryptoTransform crypto = aes.CreateDecryptor(aes.Key, aes.IV);
    byte[] secret = crypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
    crypto.Dispose();
    return Encoding.UTF8.GetString(secret);
}

private static AesCryptoServiceProvider AesCryptoServiceProvider(string key)
{
    AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
    //aes.BlockSize = 128; //Not Required
    //aes.KeySize = 256; //Not Required
    //aes.KeySize = 128;
    aes.Mode = CipherMode.CBC;
    aes.Padding = PaddingMode.PKCS7;
    aes.Key = Encoding.UTF8.GetBytes(key); //PSVJQRk9QTEpNVU1DWUZCRVFGV1VVT0 =
    aes.IV = Encoding.UTF8.GetBytes(key); //2314345645678765
    return aes;
}

Путь 2:

public static string Encrypt(string key, string data)
{
    AesCryptoServiceProvider aes = AesCryptoServiceProvider(key);
    ICryptoTransform encryptor = aes.CreateEncryptor();
    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write);
    StreamWriter streamWriter = new StreamWriter(cs);
    streamWriter.Write(data);
    streamWriter.Flush();
    cs.FlushFinalBlock();
    byte[] cypherTextBytes = ms.ToArray();
    ms.Close();
    return Convert.ToBase64String(cypherTextBytes);
}

public static string Decrypt(string key, string encrypted)
{
    AesCryptoServiceProvider aes = AesCryptoServiceProvider(key);
    byte[] encryptedBytes = Convert.FromBase64String(encrypted);
    ICryptoTransform decryptor = aes.CreateDecryptor();
    byte[] plainText = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
    return Encoding.UTF8.GetString(plainText);
}

private static AesCryptoServiceProvider AesCryptoServiceProvider(string key)
{
    AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
    //aes.BlockSize = 128; //Not Required
    //aes.KeySize = 256; //Not Required
    //aes.KeySize = 128;
    aes.Mode = CipherMode.CBC;
    aes.Padding = PaddingMode.PKCS7;
    aes.Key = Encoding.UTF8.GetBytes(key); //PSVJQRk9QTEpNVU1DWUZCRVFGV1VVT0 =
    aes.IV = Encoding.UTF8.GetBytes(key); //2314345645678765
    return aes;
}

Я пробовал оба способа на уровне API, но все же это вызывает проблемы с заполнением (иногда,не всегда)

...