基于WinForms的加密笔记管理器


背景介绍

在日常学习和工作中,我们常常需要记录各种信息,例如会议纪要、灵感想法、密码等。这些信息可能包含敏感内容,因此需要一种安全的方式来保存和管理。本文将介绍如何使用C#和Windows Forms(WinForms)开发一个轻量级的加密笔记管理器,帮助用户安全地记录和管理笔记内容。

该项目具备创建、保存、删除笔记的基本功能,并引入了凯撒密码(Caesar Cipher)作为内容加密方式。通过本项目,开发者可以学习到GUI设计、事件处理、文件操作以及简单加密算法的实现,适合中级以下开发者进行学习和实践。


思路分析

本项目的核心目标是构建一个图形界面的笔记管理器,用户可以:

  1. 新建笔记:清空标题和内容,准备创建新笔记。
  2. 保存笔记:验证标题,使用凯撒密码加密内容并保存为.txt文件。
  3. 删除笔记:如果是私密笔记,需要输入密码验证后才能删除。
  4. 加密功能:使用凯撒密码(位移3)对内容和密码进行加密。
  5. 文件管理:自动创建存储目录,遍历并加载所有.txt格式的笔记文件。

技术点解析

  • GUI设计与布局:使用SplitContainerTextBoxListBox等控件构建界面。
  • 事件驱动编程:绑定按钮点击事件和列表项选择事件。
  • 文件读写与数据处理:读取和写入本地文件,处理文件路径。
  • 简单加密算法实现:实现凯撒密码加密和解密逻辑。

代码实现(C# + WinForms)

以下是一个完整的实现代码,包含核心功能和详细注释说明:

using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;

namespace EncryptedNoteApp
{
    public partial class Form1 : Form
    {
        // 存储笔记的目录
        private readonly string notesDirectory = Path.Combine(Application.StartupPath, "notes");

        // 界面控件
        private ListBox lstNotes;
        private TextBox txtTitle;
        private TextBox txtContent;
        private Button btnNew;
        private Button btnSave;
        private Button btnDelete;
        private CheckBox chkPrivate;

        public Form1()
        {
            InitializeComponent();
            InitializeUI();
            Directory.CreateDirectory(notesDirectory); // 确保目录存在
            LoadNotes(); // 加载已有笔记
        }

        private void InitializeUI()
        {
            // 创建控件
            lstNotes = new ListBox { Dock = DockStyle.Fill };
            txtTitle = new TextBox { Location = new Point(10, 10), Width = 300 };
            txtContent = new TextBox
            {
                Multiline = true,
                Location = new Point(10, 40),
                Width = 300,
                Height = 200
            };
            btnNew = new Button { Text = "新建", Location = new Point(10, 250), Width = 75 };
            btnSave = new Button { Text = "保存", Location = new Point(90, 250), Width = 75 };
            btnDelete = new Button { Text = "删除", Location = new Point(170, 250), Width = 75 };
            chkPrivate = new CheckBox { Text = "私密", Location = new Point(10, 290) };

            // 事件绑定
            btnNew.Click += btnNew_Click;
            btnSave.Click += btnSave_Click;
            btnDelete.Click += btnDelete_Click;
            lstNotes.SelectedIndexChanged += lstNotes_SelectedIndexChanged;

            // 布局
            var splitContainer = new SplitContainer
            {
                Dock = DockStyle.Fill,
                SplitterDistance = 200
            };
            splitContainer.Panel1.Controls.Add(lstNotes);
            splitContainer.Panel2.Controls.Add(txtTitle);
            splitContainer.Panel2.Controls.Add(txtContent);
            splitContainer.Panel2.Controls.Add(btnNew);
            splitContainer.Panel2.Controls.Add(btnSave);
            splitContainer.Panel2.Controls.Add(btnDelete);
            splitContainer.Panel2.Controls.Add(chkPrivate);

            Controls.Add(splitContainer);
            Text = "加密笔记管理器";
            ClientSize = new Size(800, 500);
        }

        // 加载所有笔记文件
        private void LoadNotes()
        {
            lstNotes.Items.Clear();
            foreach (var file in Directory.GetFiles(notesDirectory, "*.txt"))
            {
                lstNotes.Items.Add(Path.GetFileName(file));
            }
        }

        // 当列表项被选中时加载笔记内容
        private void lstNotes_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstNotes.SelectedItem == null) return;

            var fileName = lstNotes.SelectedItem.ToString();
            var filePath = Path.Combine(notesDirectory, fileName);

            try
            {
                var lines = File.ReadAllLines(filePath);
                if (lines.Length < 1)
                {
                    MessageBox.Show("无效的笔记格式");
                    return;
                }

                var header = lines[0];
                var encryptedContent = string.Join("\n", lines.Skip(1));

                if (header.StartsWith("PRIVATE:"))
                {
                    var encryptedPassword = header.Substring(8);
                    var password = InputBox.Show("请输入密码", "密码验证");

                    if (string.IsNullOrEmpty(password)) return;

                    if (DecryptText(encryptedPassword) != password)
                    {
                        MessageBox.Show("密码错误");
                        return;
                    }
                }

                txtTitle.Text = Path.GetFileNameWithoutExtension(fileName).Replace("_", " ");
                txtContent.Text = DecryptText(encryptedContent);
                chkPrivate.Checked = header.StartsWith("PRIVATE:");
            }
            catch (Exception ex)
            {
                MessageBox.Show("加载笔记时出错:" + ex.Message);
            }
        }

        // 新建笔记
        private void btnNew_Click(object sender, EventArgs e)
        {
            txtTitle.Clear();
            txtContent.Clear();
            lstNotes.ClearSelected();
            chkPrivate.Checked = false;
        }

        // 保存笔记
        private void btnSave_Click(object sender, EventArgs e)
        {
            var title = txtTitle.Text.Trim();
            if (string.IsNullOrEmpty(title))
            {
                MessageBox.Show("请输入标题");
                return;
            }

            var content = txtContent.Text;
            var encryptedContent = EncryptText(content);
            var fileName = $"{SanitizeFileName(title)}.txt";
            var filePath = Path.Combine(notesDirectory, fileName);

            try
            {
                using (var writer = new StreamWriter(filePath))
                {
                    if (chkPrivate.Checked)
                    {
                        var password = InputBox.Show("请输入密码", "设置私密笔记");
                        if (string.IsNullOrEmpty(password))
                            return;

                        writer.WriteLine($"PRIVATE:{EncryptText(password)}");
                    }
                    else
                    {
                        writer.WriteLine("PUBLIC");
                    }

                    writer.WriteLine(encryptedContent);
                }

                LoadNotes();
                MessageBox.Show("笔记已保存");
            }
            catch (Exception ex)
            {
                MessageBox.Show("保存笔记时出错:" + ex.Message);
            }
        }

        // 删除笔记
        private void btnDelete_Click(object sender, EventArgs e)
        {
            if (lstNotes.SelectedItem == null)
            {
                MessageBox.Show("请选择一个笔记");
                return;
            }

            var fileName = lstNotes.SelectedItem.ToString();
            var filePath = Path.Combine(notesDirectory, fileName);
            var lines = File.ReadAllLines(filePath);
            var header = lines[0];

            if (header.StartsWith("PRIVATE:"))
            {
                var encryptedPassword = header.Substring(8);
                var password = InputBox.Show("请输入密码", "验证删除权限");

                if (string.IsNullOrEmpty(password) || DecryptText(encryptedPassword) != password)
                {
                    MessageBox.Show("密码错误,无法删除");
                    return;
                }
            }

            try
            {
                File.Delete(filePath);
                LoadNotes();
                MessageBox.Show("笔记已删除");
            }
            catch (Exception ex)
            {
                MessageBox.Show("删除笔记时出错:" + ex.Message);
            }
        }

        // 清理文件名中的非法字符
        private string SanitizeFileName(string name)
        {
            return name.Replace(" ", "_").Replace("\\", "").Replace("/", "").Replace(":", "");
        }

        // 凯撒密码加密(位移3)
        private string EncryptText(string text)
        {
            return string.Concat(text.Select(c =>
            {
                if (char.IsLetter(c))
                {
                    var baseChar = char.IsUpper(c) ? 'A' : 'a';
                    return (char)((((c + 3) - baseChar) % 26) + baseChar);
                }
                return c;
            }));
        }

        // 凯撒密码解密(位移3)
        private string DecryptText(string text)
        {
            return string.Concat(text.Select(c =>
            {
                if (char.IsLetter(c))
                {
                    var baseChar = char.IsUpper(c) ? 'A' : 'a';
                    return (char)((((c - 3) - baseChar + 26) % 26) + baseChar);
                }
                return c;
            }));
        }
    }

    // 自定义输入框类
    public static class InputBox
    {
        public static string Show(string prompt, string title)
        {
            var form = new Form
            {
                Width = 300,
                Height = 150,
                Text = title,
                StartPosition = FormStartPosition.CenterScreen
            };

            var label = new Label { Left = 20, Top = 20, Width = 260, Text = prompt };
            var textBox = new TextBox { Left = 20, Top = 50, Width = 260 };
            var buttonOk = new Button
            {
                Text = "确定",
                Left = 100,
                Top = 90,
                DialogResult = DialogResult.OK
            };
            var buttonCancel = new Button
            {
                Text = "取消",
                Left = 180,
                Top = 90,
                DialogResult = DialogResult.Cancel
            };

            form.Controls.Add(label);
            form.Controls.Add(textBox);
            form.Controls.Add(buttonOk);
            form.Controls.Add(buttonCancel);
            form.AcceptButton = buttonOk;
            form.CancelButton = buttonCancel;

            if (form.ShowDialog() == DialogResult.OK)
                return textBox.Text;
            return null;
        }
    }

    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

项目总结

本项目实现了一个基于WinForms的加密笔记管理器,具备以下特点:

  • 简单易用:界面清晰,操作直观,适合快速上手。
  • 安全性:支持私密笔记和密码保护,使用凯撒密码进行内容加密。
  • 本地化存储:所有数据保存在本地目录,无需联网或依赖外部服务。
  • 学习价值:涵盖了GUI设计、事件处理、文件操作和简单加密算法的实现,适合中级以下开发者学习。

扩展建议

为了进一步提升项目的功能和实用性,可以考虑以下扩展方向:

  1. 增加笔记分类:为笔记添加标签或分类,便于管理。
  2. 支持多种加密方式:如AES加密,提高安全性。
  3. 增加搜索功能:通过标题或内容关键词快速查找笔记。
  4. 支持导出和备份:将笔记打包为压缩文件,方便备份。
  5. 增加笔记编辑功能:允许用户修改已保存的笔记内容。
  6. 支持多语言切换:为用户提供中英文切换选项。

通过本项目,你可以深入理解C# WinForms的开发流程,并掌握如何在实际应用中集成加密功能。这不仅是一个实用的工具,更是学习Windows桌面应用开发和数据安全处理的良好起点。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注