私は暗号化の初心者であり、行ごとの暗号化を機能させようとしています。すべてを暗号化して保存するだけでなく、アプリケーションの実行中に暗号化された行をファイルに追加できるようにする必要があります。私はそれで獣のような時間を過ごしています。これが私の暗号化装置です。自分で何度か失敗した後、恥知らずに盗まれました。
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(ファイルパス);
文字列ファイル名 = fileInfo.Name;
文字列フルパス = outputPath + "\\" + ファイル名;
BinaryWriter writer = new BinaryWriter(File.OpenWrite(fullpath), Encoding.ASCII);
/// ここで試した 2 つの方法:
/// 1. 目的の方法: 行ごとに暗号化 - 生成できると仮定しました
/// データの複数のブロックを後で復号化します。これは機能していません
//string[] lines = File.ReadAllLines(filepath);
/// 2. 全体を読み取り、暗号化して一気に書き込むだけです。
文字列行 = File.ReadAllText(ファイルパス);
//foreach(行単位の文字列行)
{
byte[] バイト = Encoding.ASCII.GetBytes(行);
バイト[] エンコードされた = Encryption.Encrypt(バイト、パスワード);
writer.Write(エンコード);
ライター.フラッシュ();
}
ライター.Close();
}
private void DecryptFile(string filepath, string outputPath, string password)
{
FileInfo fileInfo = new FileInfo(ファイルパス);
文字列ファイル名 = fileInfo.Name;
文字列フルパス = outputPath + "\\" + ファイル名;
StreamWriter writer = new StreamWriter(fullpath, false, Encoding.UTF8);
byte[] バイト = File.ReadAllBytes(ファイルパス);
/// 現在復号化のために機能しているメソッドは次のとおりです。ただ
/// すべてのデータを取得し、一挙に復号化します。
byte[] 復号化 = Encryption.Decrypt(bytes, password);
文字列 s = Encoding.ASCII.GetString(復号化);
writer.Write(s);
ライター.フラッシュ();
/// 行ごとに復号化するために、ここで多くのことを試しました。
/// どれも機能しません。これは、パディングに関する問題でクラッシュします
/// 無効です。
/*
int インデックス = 0;
int カウント = 32;
while (インデックス
私はもう何をすべきか完全にはわかりません。私は物事を突っついたり、オンラインで例を読んだりして歩き回っていますが、それらはすべて、ファイル全体を暗号化する方法、またはデータの一部を暗号化して、すぐに再度復号化する以外に何もしないようです。行ごとの書き込みをどのように処理すればよいですか?