使用 CryptoStream returns 解密一个空文件
Decryption using CryptoStream returns an empty file
我正在尝试使用 AES 来了解 encryption/decryption 的工作原理。加密文件可以正常使用以下代码:
(这些方法在两个单独的文件中)
private void tempEncrypt()
{
// Creates file with "Test String" inside
byte[] test = Encoding.ASCII.GetBytes("Test String");
var file = File.Create("test.txt");
file.Write(test, 0, test.Length);
// Saves key and IV for decryption
var temp = new AesCryptoServiceProvider();
Console.WriteLine(System.Convert.ToBase64String(temp.Key));
Console.WriteLine(System.Convert.ToBase64String(temp.IV));
Encryptor.Encrypt(file, temp.Key, temp.IV);
}
public static void Encrypt(FileStream source, byte[] key, byte[] IV)
{
// Creates a temp file for encrypting
var destination = File.Create("encrypted.tmp");
string path = source.Name;
using (var provider = new AesCryptoServiceProvider())
using (var transform = provider.CreateEncryptor(key, IV))
using (var cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write))
{
// Encrypts file
source.CopyTo(cryptoStream);
source.Close();
// Deletes unencrypted file
File.Delete(path);
}
// Replaces source file with encrypted file
destination.Close();
File.Move(destination.Name, path);
File.Delete(destination.Name);
}
但是当我用这个解密文件时,文件会是空的:
private void tempDecrypt()
{
// Opens encrypted file
var file = File.OpenRead("test.txt");
var temp = new AesCryptoServiceProvider();
temp.Key = System.Convert.FromBase64String("SANeQe1MK4UKrQmJ4fa16lrhIexK7gaxqE/N/HycdhI=");
temp.IV = System.Convert.FromBase64String("Pb2SciISBP2p0hWzEUG05A==");
Encryptor.Decrypt(file, temp.Key, temp.IV);
}
public static void Decrypt(FileStream source, byte[] key, byte[] IV)
{
// Creates a temp file for decrypting
var destination = File.Create("decrypted.tmp");
string path = source.Name;
Console.WriteLine(source.Length);
// Decrypts rest of file
using (var provider = new AesCryptoServiceProvider())
using (var transform = provider.CreateDecryptor(key, IV))
using (var cryptoStream = new CryptoStream(source, transform, CryptoStreamMode.Read))
{
// Decrypts file
cryptoStream.CopyTo(destination);
}
// Replaces source file with decrypted file
destination.Close();
source.Close();
File.Delete(path);
File.Move(destination.Name, path);
File.Delete(destination.Name);
}
替换文件似乎不是问题,因为即使“decrypted.tmp”在我用源文件替换目标文件之前也是空的。
在 tempEncrypt() 方法中,我必须关闭文件然后使用 File.OpenRead() 重新打开它才能正确解密。我猜 test.txt 仍然是空的,即使我使用 file.Write() 写入文件。这是工作方法:
private void tempEncrypt()
{
// Creates file with "Test String" inside
byte[] test = Encoding.ASCII.GetBytes("Test String");
var file = File.Create("test.txt");
file.Write(test, 0, test.Length);
file.Close();
var newFile = File.OpenRead("test.txt");
// Saves key and IV for decryption
var temp = new AesCryptoServiceProvider();
Console.WriteLine(System.Convert.ToBase64String(temp.Key));
Console.WriteLine(System.Convert.ToBase64String(temp.IV));
Encryptor.Encrypt(newFile, temp.Key, temp.IV);
}
我正在尝试使用 AES 来了解 encryption/decryption 的工作原理。加密文件可以正常使用以下代码: (这些方法在两个单独的文件中)
private void tempEncrypt()
{
// Creates file with "Test String" inside
byte[] test = Encoding.ASCII.GetBytes("Test String");
var file = File.Create("test.txt");
file.Write(test, 0, test.Length);
// Saves key and IV for decryption
var temp = new AesCryptoServiceProvider();
Console.WriteLine(System.Convert.ToBase64String(temp.Key));
Console.WriteLine(System.Convert.ToBase64String(temp.IV));
Encryptor.Encrypt(file, temp.Key, temp.IV);
}
public static void Encrypt(FileStream source, byte[] key, byte[] IV)
{
// Creates a temp file for encrypting
var destination = File.Create("encrypted.tmp");
string path = source.Name;
using (var provider = new AesCryptoServiceProvider())
using (var transform = provider.CreateEncryptor(key, IV))
using (var cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write))
{
// Encrypts file
source.CopyTo(cryptoStream);
source.Close();
// Deletes unencrypted file
File.Delete(path);
}
// Replaces source file with encrypted file
destination.Close();
File.Move(destination.Name, path);
File.Delete(destination.Name);
}
但是当我用这个解密文件时,文件会是空的:
private void tempDecrypt()
{
// Opens encrypted file
var file = File.OpenRead("test.txt");
var temp = new AesCryptoServiceProvider();
temp.Key = System.Convert.FromBase64String("SANeQe1MK4UKrQmJ4fa16lrhIexK7gaxqE/N/HycdhI=");
temp.IV = System.Convert.FromBase64String("Pb2SciISBP2p0hWzEUG05A==");
Encryptor.Decrypt(file, temp.Key, temp.IV);
}
public static void Decrypt(FileStream source, byte[] key, byte[] IV)
{
// Creates a temp file for decrypting
var destination = File.Create("decrypted.tmp");
string path = source.Name;
Console.WriteLine(source.Length);
// Decrypts rest of file
using (var provider = new AesCryptoServiceProvider())
using (var transform = provider.CreateDecryptor(key, IV))
using (var cryptoStream = new CryptoStream(source, transform, CryptoStreamMode.Read))
{
// Decrypts file
cryptoStream.CopyTo(destination);
}
// Replaces source file with decrypted file
destination.Close();
source.Close();
File.Delete(path);
File.Move(destination.Name, path);
File.Delete(destination.Name);
}
替换文件似乎不是问题,因为即使“decrypted.tmp”在我用源文件替换目标文件之前也是空的。
在 tempEncrypt() 方法中,我必须关闭文件然后使用 File.OpenRead() 重新打开它才能正确解密。我猜 test.txt 仍然是空的,即使我使用 file.Write() 写入文件。这是工作方法:
private void tempEncrypt()
{
// Creates file with "Test String" inside
byte[] test = Encoding.ASCII.GetBytes("Test String");
var file = File.Create("test.txt");
file.Write(test, 0, test.Length);
file.Close();
var newFile = File.OpenRead("test.txt");
// Saves key and IV for decryption
var temp = new AesCryptoServiceProvider();
Console.WriteLine(System.Convert.ToBase64String(temp.Key));
Console.WriteLine(System.Convert.ToBase64String(temp.IV));
Encryptor.Encrypt(newFile, temp.Key, temp.IV);
}