C# 解密密码文本时,输入数据不是完整的块

C# 解密密码文本时,输入数据不是完整的块,c#,C#,有谁能帮我解决问题吗? 这是解密函数代码 public static string DecryptStringAES(string cipherText) { if (cipherText == null || cipherText.Length <= 0) throw new ArgumentNullException("plainText"); String key = "0102030405060708";

有谁能帮我解决问题吗? 这是解密函数代码

    public  static string DecryptStringAES(string cipherText)
    {
        if (cipherText == null || cipherText.Length <= 0)
            throw new ArgumentNullException("plainText");
        String key = "0102030405060708";
        String iv = "1020304050607080";
        if (key == null || key.Length <= 0)
            throw new ArgumentNullException("Key");
        if (iv == null || iv.Length <= 0)
            throw new ArgumentNullException("IV");
        byte[] bytearraytodecrypt = Encoding.ASCII.GetBytes(cipherText);


        AesCryptoServiceProvider keydecrypt = new AesCryptoServiceProvider();
        keydecrypt.BlockSize = 128;
        keydecrypt.KeySize = 128;
        keydecrypt.Key = System.Text.Encoding.UTF8.GetBytes(key);
        keydecrypt.IV = System.Text.Encoding.UTF8.GetBytes(iv);
        keydecrypt.Padding = PaddingMode.PKCS7;
        keydecrypt.Mode = CipherMode.CBC;

        ICryptoTransform crypto1 = keydecrypt.CreateDecryptor(keydecrypt.Key, keydecrypt.IV);

        byte[] returnbytearray = crypto1.TransformFinalBlock(bytearraytodecrypt, 0, bytearraytodecrypt.Length);
        crypto1.Dispose();
        return Convert.ToBase64String(returnbytearray);
    }
公共静态字符串解密字符串AES(字符串密文)
{

if(cipherText==null | | cipherText.Length不确定问题是什么

CBC模式下的AES是一种分组密码,即输入和输出为块大小的块

如果加密的输入可能不总是块大小的倍数,则可以将填充(问题代码中的PKCS#7填充)添加到要加密的数据中,使其如此。输出将是块大小的倍数

因此,这个问题没有意义,如果使用PKCS#7填充(如代码中所示),加密数据将始终是块大小的多极

解密时,解密的输出将是块大小的倍数,然后可以删除填充

通过在APIU调用中指定PKCS#7 padding,填充/取消填充将在API中发生


还有其他模式,如CTR,其中输出与输入长度相同,它们通常为“流式”模式,并且有其自身的复杂性,例如从不使用相同的键使用相同的nonce。

您好,这是修改后的代码,工作正常。 我对前面代码所做的更改是将密码文本从Base64字符串转换为bytes格式,最后在返回字符串时将其转换为System.text.Encoding.UTF8.GetString格式

public  static string DecryptStringAES(string cipherText)
{
    if (cipherText == null || cipherText.Length <= 0)
        throw new ArgumentNullException("plainText");

    String key = "0102030405060708";
    String iv = "1020304050607080";

    if (key == null || key.Length <= 0)
        throw new ArgumentNullException("Key");

    if (iv == null || iv.Length <= 0)
        throw new ArgumentNullException("IV");

    byte[] bytearraytodecrypt = Convert.FromBase64String(cipherText);

    AesCryptoServiceProvider keydecrypt = new AesCryptoServiceProvider();
    keydecrypt.BlockSize = 128;
    keydecrypt.KeySize = 128;
    keydecrypt.Key = System.Text.Encoding.UTF8.GetBytes(key);
    keydecrypt.IV = System.Text.Encoding.UTF8.GetBytes(iv);
    keydecrypt.Padding = PaddingMode.PKCS7;
    keydecrypt.Mode = CipherMode.CBC;

    ICryptoTransform crypto1 = keydecrypt.CreateDecryptor(keydecrypt.Key, keydecrypt.IV);

    byte[] returnbytearray = crypto1.TransformFinalBlock(bytearraytodecrypt, 0, bytearraytodecrypt.Length);
    crypto1.Dispose();
    return System.Text.Encoding.UTF8.GetString(returnbytearray);
}
公共静态字符串解密字符串AES(字符串密文)
{

如果(cipherText==null | | cipherText.Length)您遇到了什么问题/错误消息?Hi@Thomas,我得到的错误消息是“输入数据不是一个完整的块”。Hi可能重复,我在下面的代码行中得到错误。byte[]returnbytearray=crypto1.TransformFinalBlock(bytearraytodecrypt,0,bytearraytodecrypt.Length);错误为“输入数据不是完整的块”我传递给上述函数的输入密码文本如下:aTIqjIwgjyAbNFT+aBSjW8+U1SAPI+GMaZjPlVixEJU=提供的加密数据是Base64,即44字节。但通常加密和解密需要数据字节,您需要将Base64字符串解码为64字节进行解密。检查十六进制中的64字节:69322a8c8c8c208f201b3454FE6814A35BCF94D5200F23E18C6998CF9558B11095。另一个错误仍然需要更正。如果您还提供了预期的解密数据,这也会有所帮助。嗨,扎夫,谢谢你的回答。我已将密文转换为字节数组,它可以工作。我添加到上述函数中的代码是:byte[]ByteArrayDecrypt=Convert.FromBase64String(密文);