Exemple #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);
                            }
                        }
                    }
                }
            }
        }
Exemple #2
0
        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);
                }
            }
        }
Exemple #3
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);
                            }
                        }
                    }
                }
            }
        }
Exemple #4
0
        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);
                }

            }

        }