我有一个文本文件"toEnc.txt“(文件大小为485 b)来加密和解密。
加密后,"byte[] enc_data“的长度增加到496b。
但是我设置了"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";
}
}发布于 2017-04-20 17:48:23
您的代码有很多问题。
PaddingMode.None,那么您必须提供完全是块大小的倍数的明文(对于AES来说是16个字节)。因此,您将不能简单地加密任意明文。请使用PaddingMode.Pkcs7进行加密和解密。encrypted = msEncrypt.ToArray();块之后调用using (CryptoStream csEncrypt...:
使用(MemoryStream msEncrypt =新MemoryStream()) { new (CryptoStream csEncrypt =新CryptoStream(msEncrypt,encryptor,CryptoStreamMode.Write)) { new (StreamWriter swEncrypt =新StreamWriter(csEncrypt)) { swEncrypt.Write(toEncStr);} encrypted = msEncrypt.ToArray();}Aes实例(enc)。只需丢弃encaes和Program的代码,从enc实例中编写正确的Key和IV即可。IV不是秘密的,所以你可以把它和密文一起发送。通常,它只是简单地先于密文,并在解密前被分割掉。
https://stackoverflow.com/questions/43513795
复制相似问题