private void Encrypt(string inName) { // パスワードの入力を要求 PasswordInput form = new PasswordInput(); form.ShowDialog(); // atcファイルの保存先の指定を要求 SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "AttacheCase files (*.atc)|*.atc"; dialog.FileName = "sample.atc"; dialog.ShowDialog(); string key = form.GetPassword(); if (key.Length > 0) { // 暗号ファイルをオープン using (FileStream outfs = new FileStream(dialog.FileName, FileMode.Create)) { // 暗号ファイルをセットアップ、平文ヘッダを書き込み var locker = new AttacheCase.Locker(); locker.Open(outfs, key); Uri parentURI; ArrayList files = new ArrayList(); if (Directory.Exists(inName)) { // *** ディレクトリ // ディレクトリ以下のファイルをスキャンして追加 files.AddRange(Directory.GetFileSystemEntries(inName, "*.*", SearchOption.AllDirectories)); // ディレクトリ自身を含める files.Add(inName); // 相対パス計算用の絶対パス parentURI = new Uri(inName); } else { // *** 単一ファイル // ファイルを追加 files.Add(inName); // 相対パス計算用の絶対パス parentURI = new Uri(Directory.GetParent(inName).ToString() + "\\"); } foreach (string fileName in files) { // ファイル属性を取得 FileAttributes attribute = File.GetAttributes(fileName); Uri fileURI; if (attribute == FileAttributes.Directory) { // *** ディレクトリ // 末尾にバックスラッシュが必要 fileURI = new Uri(fileName + "\\"); } else { // *** ファイル fileURI = new Uri(fileName); } AttacheCase.FileEntry entry = new AttacheCase.FileEntry(); // エントリ名を指定 string relativepath = parentURI.MakeRelativeUri(fileURI).ToString(); // ディレクトリの区切りがスラッシュになっているので、 // 強制的にバックスラッシュへ変換する。 entry.NameUTF8 = relativepath.Replace('/', '\\'); // Shift-JISへ変換 entry.NameSJIS = Encoding.ASCII.GetString( Encoding.Convert(Encoding.ASCII, Encoding.GetEncoding("Shift_JIS"), Encoding.ASCII.GetBytes(entry.NameUTF8))); // 作成日時、更新日時を設定 entry.CreateDateTime = File.GetCreationTime(fileName); entry.ChangeDateTime = File.GetLastWriteTime(fileName); // 属性を設定 entry.Attribute = (int)attribute; if (attribute == FileAttributes.Directory) { // *** ディレクトリ // ディレクトリのファイルサイズは-1 entry.Size = -1; } else { // *** ファイル // ファイルサイズを取得して設定 using (FileStream infs = new FileStream(fileName, FileMode.Open)) { entry.Size = infs.Length; } } // エントリを追加 locker.AddFileEntry(entry); } // 暗号ヘッダを書き込み locker.WriteEncryptedHeader(outfs); // ファイルデータを書き込み foreach (string fileName in files) { // ディレクトリは無視する if (File.Exists(fileName)) { using (FileStream infs = new FileStream(fileName, FileMode.Open)) { locker.WriteFileData(outfs, infs, infs.Length); } } } } } }
public void SelfEncryptionAndDecryption() { string key = "This is a pen."; String atc_filename = "test_.atc"; String test_data_str = "The quick brown fox jumps over the lazy dog"; String test_data2_str = "Quo usque tandem abutere, Catilina, patientia nostra?"; MemoryStream test_data = new MemoryStream(Encoding.ASCII.GetBytes(test_data_str)); MemoryStream test_data2 = new MemoryStream(Encoding.ASCII.GetBytes(test_data2_str)); // UNIX時間の精度に合わせるため切り捨てる DateTime time_stamp = (new DateTime()).AddSeconds(DateTime.Now.Ticks / 10000000); using (FileStream outfs = new FileStream(atc_filename, FileMode.Create)) { var locker = new AttacheCase.Locker(); locker.PasswdTryLimit = 5; locker.SelfDestruction = true; Assert.AreEqual(locker.Open(outfs, key), AttacheCase.Result.OK); { var entry = new AttacheCase.FileEntry(); entry.Attribute = 16; entry.Size = -1; entry.NameSJIS = "out\\"; entry.NameUTF8 = "out\\"; entry.ChangeDateTime = time_stamp; entry.CreateDateTime = time_stamp; Assert.AreEqual(locker.AddFileEntry(entry), AttacheCase.Result.OK); } { var entry = new AttacheCase.FileEntry(); entry.Attribute = 0; entry.Size = test_data.Length; entry.NameSJIS = "out\\test.txt"; entry.NameUTF8 = "out\\test.txt"; entry.ChangeDateTime = time_stamp; entry.CreateDateTime = time_stamp; Assert.AreEqual(locker.AddFileEntry(entry), AttacheCase.Result.OK); } { var entry = new AttacheCase.FileEntry(); entry.Attribute = 0; entry.Size = test_data2.Length; entry.NameSJIS = "out\\test2.txt"; entry.NameUTF8 = "out\\test2.txt"; entry.ChangeDateTime = time_stamp; entry.CreateDateTime = time_stamp; Assert.AreEqual(locker.AddFileEntry(entry), AttacheCase.Result.OK); } Assert.AreEqual(locker.WriteEncryptedHeader(outfs), AttacheCase.Result.OK); Assert.AreEqual(locker.WriteFileData(outfs, test_data, (uint)test_data.Length), AttacheCase.Result.OK); Assert.AreEqual(locker.WriteFileData(outfs, test_data2, (uint)test_data2.Length), AttacheCase.Result.OK); Assert.AreEqual(locker.Close(), AttacheCase.Result.OK); } using (FileStream infs = new FileStream(atc_filename, FileMode.Open)) { var unlocker = new AttacheCase.Unlocker(); Assert.AreEqual(unlocker.Open(infs, key), AttacheCase.Result.OK); Assert.AreEqual(unlocker.PasswdTryLimit, 5); Assert.IsTrue(unlocker.SelfDestruction); Assert.AreEqual(unlocker.Entries.Length, 3); { var entry = unlocker.Entries[1]; Assert.AreEqual(entry.ChangeDateTime, time_stamp); Assert.AreEqual(entry.CreateDateTime, time_stamp); MemoryStream buf = new MemoryStream(); Assert.AreEqual(unlocker.ExtractFileData(buf, infs, (uint)entry.Size), AttacheCase.Result.OK); buf.Position = 0; Assert.AreEqual((new StreamReader(buf)).ReadToEnd(), test_data_str); } { var entry = unlocker.Entries[2]; Assert.AreEqual(entry.ChangeDateTime, time_stamp); Assert.AreEqual(entry.CreateDateTime, time_stamp); MemoryStream buf = new MemoryStream(); Assert.AreEqual(unlocker.ExtractFileData(buf, infs, (uint)entry.Size), AttacheCase.Result.OK); buf.Position = 0; Assert.AreEqual((new StreamReader(buf)).ReadToEnd(), test_data2_str); } } }