C#AES解密总是以10字节的凌乱代码结束。
我有一个文本文件“toEnc.txt”(文件大小为485b)进行加密和解密 加密后,“byte[]enc_data”的长度增加到496b。C#AES解密总是以10字节的凌乱代码结束。,c#,encryption,cryptography,C#,Encryption,Cryptography,我有一个文本文件“toEnc.txt”(文件大小为485b)进行加密和解密 加密后,“byte[]enc_data”的长度增加到496b。 但是我设置了“enc.Padding=PaddingMode.None 解密后,不管文本内容是什么,“testout.txt”最后总是有10字节的凌乱代码 我还尝试了.zip文件。加密的文件长度也增加了,解密后的文件被破坏了(可能是因为zip文件末尾的代码很乱) 这是我的密码: private async Task RunEncryption(
但是我设置了“enc.Padding=PaddingMode.None 解密后,不管文本内容是什么,“testout.txt”最后总是有10字节的凌乱代码 我还尝试了.zip文件。加密的文件长度也增加了,解密后的文件被破坏了(可能是因为zip文件末尾的代码很乱) 这是我的密码:
private async Task RunEncryption()
{
String data;
using (StreamReader sr = new StreamReader("toEnc.txt"))
{
data = sr.ReadToEnd();
}
byte[] enc_data = await Program.myEncrypt(data);
await RunDecrypt(enc_data); //to test if decryption works
}
static async Task<byte[]> myEncrypt(string toEncStr)
{
byte[] encrypted;
using (Aes enc = Aes.Create())
{
Aes encaes = Aes.Create();
encaes.Key = enc.Key;
encaes.IV = enc.IV;
Program.Key = enc.Key;
Program.IV = enc.IV;
try
{
FileStream fs = new FileStream("key.txt", FileMode.OpenOrCreate);
fs.Write(Key, 0, Key.Length);
fs.Write(IV, 0, IV.Length);
fs.Close();
}
catch ( Exception e)
{
Console.WriteLine("Encryption failed!{0}.", e.Message);
Environment.Exit(0);
}
enc.Padding = PaddingMode.None;
ICryptoTransform encryptor = encaes.CreateEncryptor(encaes.Key, encaes.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(toEncStr);
}
encrypted = msEncrypt.ToArray();
}
}
}
return encrypted;
}
private async Task RunDecrypt(byte[] inbytes)
{
try
{
String write_data = await myDecrypt(inbytes);
using (StreamWriter sw = new StreamWriter("testout.txt", true))
{
sw.Write(write_data);
sw.Close();
}
}
catch (Exception e)
{
}
}
async Task<String> myDecrypt(byte[] toDecBytes)
{
try
{
String decrypted;
using (Aes dec = Aes.Create())
{
byte[] Key = new byte[dec.Key.Length];
byte[] IV = new byte[dec.IV.Length];
FileStream fsread = new FileStream("key.txt", FileMode.Open);
fsread.Read(Key, 0, Key.Length);
fsread.Read(IV, 0, IV.Length);
fsread.Close();
dec.Key = Key;
dec.IV = IV;
dec.Padding = PaddingMode.None;
ICryptoTransform decryptor = dec.CreateDecryptor(dec.Key, dec.IV);
using (MemoryStream msDecrypt = new MemoryStream(toDecBytes))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
decrypted = srDecrypt.ReadToEnd();
//decrypted = srDecrypt.Read( , 0, );
return decrypted;
}
}
}
}
}
catch (Exception e)
{
Console.WriteLine("Decryption failed! {0}.", e.Message);
return @"null";
}
}
专用异步任务RunEncryption()
{
字符串数据;
使用(StreamReader sr=newstreamreader(“toEnc.txt”))
{
数据=sr.ReadToEnd();
}
字节[]enc_data=wait Program.myEncrypt(数据);
等待RunDecrypt(enc_data);//测试解密是否有效
}
静态异步任务myEncrypt(字符串到encstr)
{
字节[]加密;
使用(Aes enc=Aes.Create())
{
Aes encaes=Aes.Create();
encaes.Key=附件键;
encaes.IV=enc.IV;
程序键=加密键;
Program.IV=enc.IV;
尝试
{
FileStream fs=newfilestream(“key.txt”,FileMode.OpenOrCreate);
fs.Write(Key,0,Key.Length);
fs.写入(IV,0,IV.长度);
fs.Close();
}
捕获(例外e)
{
WriteLine(“加密失败!{0}.”,e.Message);
环境。退出(0);
}
附件填充=填充模式。无;
ICryptoTransform encryptor=encaes.CreateEncryptor(encaes.Key,encaes.IV);
使用(MemoryStream msEncrypt=new MemoryStream())
{
使用(CryptoStream csEncrypt=new CryptoStream(msEncrypt,encryptor,CryptoStreamMode.Write))
{
使用(StreamWriter swEncrypt=newstreamwriter(csEncrypt))
{
swEncrypt.Write(toEncStr);
}
加密=msEncrypt.ToArray();
}
}
}
返回加密;
}
专用异步任务RunDecrypt(字节[]inbytes)
{
尝试
{
字符串写入\ U数据=等待myDecrypt(以字节为单位);
使用(StreamWriter sw=newstreamwriter(“testout.txt”,true))
{
软件写入(写入数据);
sw.Close();
}
}
捕获(例外e)
{
}
}
异步任务myDecrypt(字节[]到字节)
{
尝试
{
字符串解密;
使用(Aes dec=Aes.Create())
{
字节[]键=新字节[dec.Key.Length];
字节[]IV=新字节[dec.IV.Length];
FileStream fsread=newfilestream(“key.txt”,FileMode.Open);
fsread.Read(Key,0,Key.Length);
fsread.Read(IV,0,IV.Length);
fsread.Close();
十二月键=键;
十二月四日=四日;
十二月填充=填充模式。无;
ICryptoTransform decryptor=dec.CreateDecryptor(dec.Key,dec.IV);
使用(MemoryStream msDecrypt=新的MemoryStream(toDecBytes))
{
使用(CryptoStream csDecrypt=新加密流(msDecrypt、解密程序、CryptoStreamMode.Read))
{
使用(StreamReader srDecrypt=新的StreamReader(csDecrypt))
{
decrypted=srDecrypt.ReadToEnd();
//decrypted=srDecrypt.Read(,0,);
返回解密;
}
}
}
}
}
捕获(例外e)
{
WriteLine(“解密失败!{0}.”,e.Message);
返回@“null”;
}
}
您的代码有很多问题
- 如果使用
,则必须提供正好是块大小倍数的明文(AES为16字节)。所以,您不能简单地加密任意明文。请使用PaddingMode.None
进行加密和解密PaddingMode.Pkcs7
- 你正在读密文,它还没有完全写出来。您需要调用
encrypted=msEncrypt.ToArray()代码>在
块之后:使用(CryptoStream csEncrypt…
using (MemoryStream msEncrypt = new MemoryStream()) { using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) { using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) { swEncrypt.Write(toEncStr); } } encrypted = msEncrypt.ToArray(); }
- 您有太多可用于加密的变量。您只需要一个
实例(Aes
)。只需将代码与enc
和encaes
一起丢弃,然后从Program
实例中写入正确的enc
密钥和
IV
IV不是秘密,因此您可以将其与密文一起发送。通常,它只是在密文前加上前缀并在解密前切掉。为什么要使用2
Aes
变量-enc
和encaes
?您在enc
变量上设置Padding
,然后使用encaes代码>用于编码。呃..这是一个错误..谢谢!我删除了不必要的变量并将填充模式更改为PKCS7
,并且按照您所说的那样,它工作了!出现了另一个问题…当我将代码RunDecrypt
和myDecrypt
的解密部分放在单独的解密程序中时,出现了一个错误ying解密失败!填充无效且无法删除。
这是怎么回事?另一个问题,当我加密.zip或二进制文件时,文件大小增加,文件损坏。似乎只有txt文件大小可以保持不变?无效的填充可能意味着您不期望