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(密文);