我对加密还很陌生,我正在尝试让逐行加密器工作;我需要能够在应用程序运行期间将加密行附加到文件中,而不仅仅是一大堆加密所有内容并保存。不过我玩得很开心。这是我的加密器,在我自己多次尝试失败后被无耻地窃取:
class Encryption
{
private static readonly byte[] SALT = new byte[] { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c };
public static byte[] Encrypt(byte[] plain, string password)
{
MemoryStream memoryStream;
CryptoStream cryptoStream;
Rijndael rijndael = Rijndael.Create();
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
rijndael.Key = pdb.GetBytes(32);
rijndael.IV = pdb.GetBytes(16);
memoryStream = new MemoryStream();
cryptoStream = new CryptoStream(memoryStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write);
cryptoStream.Write(plain, 0, plain.Length);
cryptoStream.FlushFinalBlock();
cryptoStream.Close();
return memoryStream.ToArray();
}
public static byte[] Decrypt(byte[] cipher, string password)
{
MemoryStream memoryStream;
CryptoStream cryptoStream;
Rijndael rijndael = Rijndael.Create();
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
rijndael.Key = pdb.GetBytes(32);
rijndael.IV = pdb.GetBytes(16);
memoryStream = new MemoryStream();
cryptoStream = new CryptoStream(memoryStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write);
cryptoStream.Write(cipher, 0, cipher.Length);
cryptoStream.FlushFinalBlock();
cryptoStream.Close();
return memoryStream.ToArray();
}
}
这是一个虚拟函数,展示了我如何尝试它:
private void EncryptFile(string filepath, string outputPath, string password)
{
FileInfo fileInfo = new FileInfo(filepath);
string filename = fileInfo.Name;
string fullpath = outputPath + "\\" + filename;
BinaryWriter writer = new BinaryWriter(File.OpenWrite(fullpath), Encoding.ASCII);
/// Two methods that I've attempted here:
/// 1. The desired method: encrypt line by line - I assumed I'd be able to generate
/// multiple blocks of data and decrypt them later. This isn't working
//string[] lines = File.ReadAllLines(filepath);
/// 2. Just read the whole thing and encrypt and write it in one swoop.
string line = File.ReadAllText(filepath);
//foreach(string line in lines)
{
byte[] bytes = Encoding.ASCII.GetBytes(line);
byte[] encoded = Encryption.Encrypt(bytes, password);
writer.Write(encoded);
writer.Flush();
}
writer.Close();
}
private void DecryptFile(string filepath, string outputPath, string password)
{
FileInfo fileInfo = new FileInfo(filepath);
string filename = fileInfo.Name;
string fullpath = outputPath + "\\" + filename;
StreamWriter writer = new StreamWriter(fullpath, false, Encoding.UTF8);
byte[] bytes = File.ReadAllBytes(filepath);
/// Here is the method that's working at the moment for decrypting; just
/// grab all the data and decrypt it on one swoop.
byte[] decrypted = Encryption.Decrypt(bytes, password);
string s = Encoding.ASCII.GetString(decrypted);
writer.Write(s);
writer.Flush();
/// I've tried a number of things here to decrypt line by line,
/// none of which work. This crashes with an issue about the padding
/// being invalid.
/*
int index = 0;
int count = 32;
while (index
我不完全确定我应该做什么了。我一直在网上闲逛并阅读示例,但它们似乎都是如何加密整个文件或只是加密一段数据并且除了立即再次解密之外不对其执行任何操作。我应该如何处理逐行写作?