Получение ошибки «заполнение недопустимо и не может быть удалено» во время расшифровки - PullRequest
0 голосов
/ 21 января 2019

Я использую следующий код для шифрования и дешифрования пароля,

public static string EncryptStringPassword(string plainSourceStringToEncrypt)
{
    //Set up the encryption objects
    using (AesCryptoServiceProvider acsp = GetProvider(Encoding.Default.GetBytes(Key)))
    {
        byte[] sourceBytes = Encoding.ASCII.GetBytes(plainSourceStringToEncrypt);
        ICryptoTransform ictE = acsp.CreateEncryptor();

        //Set up stream to contain the encryption
        MemoryStream msS = new MemoryStream();

        //Perform the encrpytion, storing output into the stream
        CryptoStream csS = new CryptoStream(msS, ictE, CryptoStreamMode.Write);
        csS.Write(sourceBytes, 0, sourceBytes.Length);
        csS.FlushFinalBlock();

        //sourceBytes are now encrypted as an array of secure bytes
        byte[] encryptedBytes = msS.ToArray(); //.ToArray() is important, don't mess with the buffer

        //return the encrypted bytes as a BASE64 encoded string
        return Convert.ToBase64String(encryptedBytes);
    }
}

//AES
public static string DecryptStringPassword(string base64StringToDecrypt)
{
    //Set up the encryption objects
    using (AesCryptoServiceProvider acsp = GetProvider(Encoding.Default.GetBytes(Key)))
    {
        byte[] RawBytes = Convert.FromBase64String(base64StringToDecrypt);
        ICryptoTransform ictD = acsp.CreateDecryptor();

        //RawBytes now contains original byte array, still in Encrypted state

        //Decrypt into stream
        MemoryStream msD = new MemoryStream(RawBytes, 0, RawBytes.Length);
        CryptoStream csD = new CryptoStream(msD, ictD, CryptoStreamMode.Read);
        //csD now contains original byte array, fully decrypted

        //return the content of msD as a regular string
        return (new StreamReader(csD)).ReadToEnd();
    }
}

private static AesCryptoServiceProvider GetProvider(byte[] key)
{
    AesCryptoServiceProvider result = new AesCryptoServiceProvider();
    result.BlockSize = 128;
    result.KeySize = 128;
    result.Mode = CipherMode.CBC;
    result.Padding = PaddingMode.PKCS7;

    result.GenerateIV();
    result.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

    byte[] RealKey = GetKey(key, result);
    result.Key = RealKey;
    // result.IV = RealKey;
    return result;
}

Внезапно при проверке пароля одного из пользователей появляется сообщение об ошибке "Заполнение недопустимо и не может быть удалено".

для других пользователей работает нормально. Только для одного пользователя это дает проблему.

Будет ли возможно, если пароль был недавно изменен и содержит ли он какой-либо определенный символ? или длина пароля может привести к этой ошибке? Будет ли это из-за самого пароля (как я уже сказал, может быть длина или что-то)

(до того, как у того же пользователя не возникнет проблем со входом в приложение)

В противном случае, что может быть причиной для получения вышеуказанной ошибки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...