解密时出现错误“填充无效且无法删除”

时间:2019-01-21 09:55:09

标签: c# encryption

我正在使用以下代码对密码进行加密和解密,

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;
}

突然验证用户密码之一时,出现错误“填充无效且无法删除”。

对于其他用户,它工作正常。仅对于一个用户来说,它给与问题。

是否有可能最近更改了密码并且密码是否包含任何特定字符?还是密码长度会产生此错误?是因为密码本身(如我所说的可能是长度或某物)

(在同一用户登录应用程序之前没有问题)

否则,出现上述错误的原因可能是什么?

0 个答案:

没有答案