Ejemplo n.º 1
0
        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);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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");
                    }
                }
            }
        }