暗号化と復号化に使用するテキストファイル "toEnc.txt"(ファイルサイズは485b)があります。C#AES解読は常に10バイトの乱雑なコードで終了します。
暗号化後、「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";
}
}
なぜ2つの 'Aes'変数、' enc'と 'encaes'を使用していますか? 'padding'を' enc'変数に設定していますが、エンコードに 'encaes'を使用しています。 –
ええ、それは間違いです。 –