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); } } } } } }
private void Decrypt(string fileName) { // パスワードの入力を要求 PasswordInput form = new PasswordInput(); form.ShowDialog(); string key = form.GetPassword(); if (key.Length > 0) { using (FileStream infs = new FileStream(fileName, FileMode.Open)) { var unlocker = new AttacheCase.Unlocker(); // 指定したキーで復号を試みる AttacheCase.Result result = unlocker.Open(infs, key); if (result == AttacheCase.Result.OK) { // *** ヘッダの復号に成功 foreach (AttacheCase.FileEntry entry in unlocker.Entries) { string dirPath = Path.GetDirectoryName(fileName); string outName = dirPath + "\\" + entry.NameSJIS; if (entry.Size < 0) { // *** ディレクトリ // 無かったら作る if (!Directory.Exists(outName)) { Directory.CreateDirectory(outName); } // 作成日時、更新日時を設定 Directory.SetCreationTime(outName, entry.CreateDateTime); Directory.SetLastWriteTime(outName, entry.ChangeDateTime); } else { // *** ファイル using (FileStream outfs = new FileStream(outName, FileMode.Create)) { unlocker.ExtractFileData(outfs, infs, entry.Size); } // 作成日時、更新日時を設定 File.SetCreationTime(outName, entry.CreateDateTime); File.SetLastWriteTime(outName, entry.ChangeDateTime); } } MessageBox.Show("Decryption completed"); } else if (result == AttacheCase.Result.ERR_WRONG_KEY) { // *** パスワードが違う MessageBox.Show("Wrong password"); } else { // *** 読み込み失敗 MessageBox.Show("Failed"); } } } }