C语言之文本加密程序设计

news2025/5/13 9:20:20


🌟 嗨,我是LucianaiB!

🌍 总有人间一两风,填我十万八千梦。

🚀 路漫漫其修远兮,吾将上下而求索。


文本加密程序设计

摘要:本文设计了一种文本加密程序,旨在提高信息安全性,保护个人和企业隐私数据。程序由加密算法基类、加密算法实现、文件操作类和程序界面类四个主要部分组成,主要使用了C++编程语言、面向对象程序设计方法和标准库中的文本操作函数。主要解决方案包括实现凯撒密码和异或加密算法,以及用户界面交互功能,方便用户进行文本的加密和解密操作。程序的优点在于模块化设计,提高了代码的可读性、可维护性和可扩展性,同时支持多种加密算法,满足不同用户的需求。
关键词:文本加密;C++;面向对象程序设计;模块化设计

1 前言

随着信息技术的飞速发展,信息安全问题日益突出,尤其是在数据传输和存储过程中,如何有效地保护信息不被非法获取或篡改成为了一个重要课题。文本加密作为信息安全领域中的一个重要分支,其目的是通过对文本数据进行加密处理,确保只有授权的用户才能访问和理解原始信息。本课题旨在设计并实现一个文本加密程序,以提高信息的安全性,保护个人和企业的隐私数据。
本设计将围绕文本加密程序的设计与实现展开,要求学生掌握文本加密的基本原理和相关技术,能够设计并实现一个简单的文本加密程序。具体内容包括:

  1. 根据需求分析,提出文本加密程序的设计思路,包括使用面向对象程序设计方法设计文本加密类、使用加密算法对文本进行加密和解密等;
  2. 实现文本加密程序的关键技术,包括使用C++标准库中的文本操作函数进行文本读写、使用加密算法对文本进行加密和解密等。同时,实现用户界面交互功能,方便用户进行文本加密和解密操作;
  3. 对文本加密程序进行测试与调试,确保各项功能正常运行,并解决可能出现的问题。

2 总体方案设计

2.1系统设计总体方案

本次设计的文本加密程序旨在提供一个用户友好的界面,用于文本的加密和解密操作。程序将支持多种加密算法,允许用户选择不同的加密方法,并能够处理来自文件的文本数据。系统主要由以下几个部分组成:
加密算法基类(Encryptor):定义了加密和解密操作的接口。
加密算法实现(CaesarCipher, XORCipher):实现了具体的加密算法。
文件操作类(FileHandler):负责文件的读取和写入操作。
程序界面类(TextEncryptionProgram):提供用户界面,处理用户输入和程序流程。
在这里插入图片描述

图1 系统框图

整个程序的工作原理是:用户通过界面选择操作,程序根据用户的选择调用相应的加密或解密算法,处理文本数据,并显示结果或将结果保存到文件。

2.2方案可行性论证

本程序的设计采用了模块化和面向对象的设计方法,将不同的功能封装在不同的类中,提高了代码的可重用性和可维护性。程序支持两种加密算法:凯撒密码和异或加密,这两种算法都是广泛研究和应用的加密技术,具有较高的可行性。程序还提供了文件操作功能,使得用户可以方便地处理文件中的文本数据。
方案一(凯撒密码)的优点是实现简单,易于理解,适用于教学和演示目的。方案二(异或加密)的优点是安全性较高,适用于需要较高保密性的场合。综合考虑,本程序同时支持这两种方案,以满足不同用户的需求。

3 软件设计

本课题的软件设计采用了模块化设计的思想,将程序分解为若干个功能独立的模块,每个模块负责特定的任务,以提高代码的可读性、可维护性和可扩展性。模块化设计还有助于简化调试过程,因为每个模块可以独立于其他模块进行测试和验证。主程序流程如图2所示。
在这里插入图片描述

图2 主程序流程图

在主程序流程中,程序首先显示菜单,然后根据用户的选择执行相应的操作:
• 如果用户选择1,程序将输入文本;
• 如果用户选择2,程序将加密当前文本;
• 如果用户选择3,程序将解密当前文本;
• 如果用户选择4,程序将从文件读取文本;
• 如果用户选择5,程序将保存当前文本到文件;
• 如果用户选择6,程序将切换加密方法;
• 如果用户选择7,程序将显示当前文本;
• 如果用户选择0,程序将退出。
每个选择都对应一个特定的功能模块,这些模块通过调用相应的类和方法来实现其功能。程序流程的设计确保了用户可以轻松地在不同的操作之间切换,同时保持了程序的灵活性和响应性。通过这种设计,程序能够以用户友好的方式提供文本加密和解密服务。

4 系统调试与结果分析

测试用例 1:凯撒密码加密和解密
• 输入文本: “Hello, World!”
• 密钥: “3”
• 加密结果: “Khoor, Zruog!”
• 解密结果: “Hello, World!”
测试用例 2:凯撒密码处理大写和小写字母
• 输入文本: “The Quick Brown Fox Jumps Over The Lazy Dog”
• 密钥: “3”
• 加密结果: " Wkh Txlfn Eurzq Ira Mxpsv Ryhu Wkh Odcb Grj "
• 解密结果: “The Quick Brown Fox Jumps Over The Lazy Dog”
测试用例 3:异或加密和解密
• 输入文本: “Secret Message”
• 密钥: “Key”
• 解密结果: “Secret Message” (因为异或加密解密相同)
测试用例 4:处理非字母字符
• 输入文本: “Hello, 123 World!”
• 密钥 (凯撒密码): “3”
• 加密结果: “Khoor, 123 Zruog!”
• 密钥 (异或密码): “abc”
测试用例 5:文件读写
• 步骤:

  1. 创建一个名为 test.txt 的文件,写入一些文本,例如 “This is a test file.”
  2. 使用程序的 “从文件读取” 功能读取 test.txt 的内容。
  3. 使用程序的 “保存到文件” 功能将当前文本保存到 output.txt。
  4. 检查 output.txt 的内容是否与 test.txt 的内容相同。
    测试用例 6:密钥长度与文本长度的关系(异或加密)
    • 输入文本: “A very long message to test the XOR cipher”
    • 密钥: “short”
    • 结果: 密钥 “short” 会循环使用,直到加密完整个消息。
    测试用例 7:错误处理
    • 步骤:
  5. 尝试读取一个不存在的文件 (例如,nonexistent.txt)。
  6. 检查程序是否正确捕获并处理 std::runtime_error 异常。
  7. 尝试使用一个非数字字符串作为凯撒密码的密钥。
  8. 检查程序是否正确处理atoi的错误。

5 结论及进一步设想

结论:基于测试结果,该文本加密程序实现了预期的加密和解密功能,包括凯撒密码和异或加密两种算法,并支持从文件读取和保存文本。 然而,目前设计存在以下缺陷:

  1. 密钥管理: 程序中的密钥直接在代码中或通过简单的用户输入获取,缺乏安全可靠的密钥管理机制。这使得密钥容易泄露,降低了安全性。 改进方法:采用更安全的密钥存储和管理方式,例如使用加密的配置文件或密钥库。
  2. 算法局限性: 目前仅支持凯撒密码和异或加密两种算法,算法种类有限,安全性相对较低。 改进方法:增加更多种类的加密算法,例如AES、RSA等更高级的加密算法,以提高安全性。
  3. 错误处理: 虽然程序包含了异常处理机制,但错误信息提示不够友好和具体,难以帮助用户快速定位和解决问题。 改进方法:改进异常处理机制,提供更详细、更易于理解的错误信息,并引导用户进行相应的操作。
  4. 安全性: 异或加密的安全性依赖于密钥的随机性和长度。 简单的密钥容易被破解。 改进方法: 对于异或加密,需要确保密钥的生成方式足够随机且长度足够长,并考虑结合其他加密技术来增强安全性。
    进一步设想:
  5. 集成密钥生成器: 集成一个随机密钥生成器,自动生成更安全、更复杂的密钥。
  6. 支持多种文件格式: 扩展程序的功能,使其能够支持读取和保存多种文件格式,例如.txt, .doc, .pdf等。 这需要引入相应的库来处理不同的文件格式。
  7. 多语言支持: 实现多语言支持,方便不同语言背景的用户使用。
  8. 网络功能: 增加网络功能,允许用户通过网络进行加密和解密操作,实现远程加密和解密。 这需要考虑网络安全和数据传输的可靠性。
  9. 可扩展性: 设计一个更模块化的架构,方便将来添加新的加密算法和功能,提高程序的可扩展性。

本次课程设计让我对文本加密技术有了更深入的理解。 在设计过程中,我学习了C++编程语言的更多特性,例如面向对象编程、异常处理、文件操作等。 我完成了文本加密程序的设计与实现,包括凯撒密码和异或加密两种算法,并实现了文件读写功能。 通过这个项目,我不仅巩固了课堂上学习的知识,也提升了我的编程能力和问题解决能力。
在设计过程中,我遇到了不少挑战。 例如,在设计用户界面时,我需要考虑如何才能让用户更方便地使用程序;在实现加密算法时,我需要仔细考虑算法的安全性以及效率;在处理文件读写时,我需要处理各种可能的错误。 这些挑战让我学习到了很多,也让我对软件开发的复杂性有了更深刻的认识。
通过这次课程设计,我体会到软件开发是一个系统工程,需要考虑很多方面的问题,例如算法设计、数据结构、用户界面设计、错误处理等。 一个好的软件不仅需要功能强大,还需要易于使用、安全可靠。 在未来的学习中,我将继续努力学习,提升自己的编程能力和软件开发能力。

附录1 程序运行图
在这里插入图片描述

附录2 程序清单

#include <iostream>
#include <string>
#include <fstream>
#include <stdexcept>
#include <vector>
#include <cstdlib>
#include <cctype>

// 加密算法基类
class Encryptor {
protected:
    std::string key;
public:
    Encryptor(const std::string& k) : key(k) {}
    virtual std::string encrypt(const std::string& text) = 0;
    virtual std::string decrypt(const std::string& text) = 0;
    virtual ~Encryptor() {}
};

// 凯撒密码实现
class CaesarCipher : public Encryptor {
public:
    CaesarCipher(const std::string& k) : Encryptor(k) {}
    
    std::string encrypt(const std::string& text) {
        std::string result = text;
        int shift = atoi(key.c_str()) % 26;
        
        for(size_t i = 0; i < result.length(); i++) {
            if(isalpha(result[i])) {
                char base = isupper(result[i]) ? 'A' : 'a';
                result[i] = base + (result[i] - base + shift) % 26;
            }
        }
        return result;
    }
    
    std::string decrypt(const std::string& text) {
        std::string result = text;
        int shift = atoi(key.c_str()) % 26;
        
        for(size_t i = 0; i < result.length(); i++) {
            if(isalpha(result[i])) {
                char base = isupper(result[i]) ? 'A' : 'a';
                result[i] = base + (result[i] - base - shift + 26) % 26;
            }
        }
        return result;
    }
};
// 异或加密实现
class XORCipher : public Encryptor {
public:
    XORCipher(const std::string& k) : Encryptor(k) {}
    
    std::string encrypt(const std::string& text) {
        std::string result = text;
        for(size_t i = 0; i < text.length(); i++) {
            result[i] = text[i] ^ key[i % key.length()];
        }
        return result;
    }
    std::string decrypt(const std::string& text) {
        return encrypt(text); // XOR加密的特性使得加密和解密操作相同
    }
};
// 文件操作类
class FileHandler {
public:
    static std::string readFile(const std::string& filename) {
        std::ifstream file(filename.c_str());  // 使用c_str()打开文件
        if (!file.is_open()) {
            throw std::runtime_error("无法打开文件: " + filename);
        }
        std::string content;
        std::string line;
        while (std::getline(file, line)) {
            content += line + "\n";
        }
        file.close();
        return content;
    } 
    static void writeFile(const std::string& filename, const std::string& content) {
        std::ofstream file(filename.c_str());  // 使用c_str()打开文件
        if (!file.is_open()) {
            throw std::runtime_error("无法创建文件: " + filename);
        }
        
        file << content;
        file.close();
    }
};

// 程序界面类
class TextEncryptionProgram {
private:
    Encryptor* encryptor;  // 改用普通指针
    void showMenu() {
        std::cout << "\n文本加密程序\n";
        std::cout << "1. 输入文本\n";
        std::cout << "2. 加密文本\n";
        std::cout << "3. 解密文本\n";
        std::cout << "4. 从文件读取\n";
        std::cout << "5. 保存到文件\n";
        std::cout << "6. 切换加密方法\n";
        std::cout << "7. 显示当前文本\n";
        std::cout << "0. 退出\n";
        std::cout << "请选择: ";
    }
public:
    TextEncryptionProgram() {
        encryptor = new CaesarCipher("3");  // 使用new替代make_unique
    }
    ~TextEncryptionProgram() {
        delete encryptor;  // 手动释放内存
    }
    
    void run() {
        std::string currentText;
        int choice;
        do {
            showMenu();
            std::cin >> choice;
            std::cin.ignore();
            
            try {
int main() {
    TextEncryptionProgram program;
    program.run();
    return 0;
}


嗨,我是LucianaiB。如果你觉得我的分享有价值,不妨通过以下方式表达你的支持:👍 点赞来表达你的喜爱,📁 关注以获取我的最新消息,💬 评论与我交流你的见解。我会继续努力,为你带来更多精彩和实用的内容。

点击这里👉LucianaiB ,获取最新动态,⚡️ 让信息传递更加迅速。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2339377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云效部署实现Java项目自动化部署图解

前言 记录下使用云效部署Java项目&#xff0c;实现java项目一键化自动化部署。 云效流程说明&#xff1a; 1.云效拉取最新git代码后 2.进行maven编译打包后&#xff0c;上传到指定服务器目录 3.通过shell脚本&#xff0c;先kill java项目后&#xff0c;通过java -jar 启动项…

0801ajax_mock-网络ajax请求1-react-仿低代码平台项目

0 vite配置proxy代理 vite.config.ts代码如下图所示&#xff1a; import { defineConfig } from "vite"; import react from "vitejs/plugin-react";// https://vite.dev/config/ export default defineConfig({plugins: [react()],server: {proxy: {&qu…

基于Python智能体API的Word自动化排版系统:从零构建全流程模块化工作流与版本控制研究

基于Python智能体API的Word自动化排版系统:从零构建全流程模块化工作流与版本控制实践研究 1. 引言2. 研究背景与意义3. 自动排版工作流的设计原理3.1 文档内容提取与解析3.2 样式参数与格式化规则3.3 智能体API接口调用3.4 自动生成与批量处理3.5 与生成式AI的协同4. 系统架构…

Java【网络原理】(4)HTTP协议

目录 1.前言 2.正文 2.1自定义协议 2.2HTTP协议 2.2.1抓包工具 2.2.2请求响应格式 2.2.2.1URL 2.2.2.2urlencode 2.2.3认识方法 2.2.3.1GET与POST 2.2.3.2PUT与DELETE 2.2.4请求头关键属性 3.小结 1.前言 哈喽大家好啊&#xff0c;今天来继续给大家带来Java中网络…

每天学一个 Linux 命令(27):head

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/27/index.html head 是 Linux 中用于查看文件开头部分内容的命令,默认显示文件前 10 行,适合快速预览文件结构或日志头部信息。 命令格式 head [选项] [文件]常用选项 选项说明-n <行数>指定显示前 N 行(如…

【2025软考高级架构师】——计算机系统基础(7)

摘要 本文主要介绍了计算机系统的组成&#xff0c;包括硬件和软件两大部分。硬件由处理器、存储器、总线、接口和外部设备等组成&#xff0c;软件则涵盖系统软件和应用软件。文章还详细阐述了冯诺依曼计算机的组成结构&#xff0c;包括 CPU、主存储器、外存等&#xff0c;并解…

LeetCode 打家劫舍+删除并获得点数

题目描述 打家劫舍题目传送门1 删除并获得点数传送门2 思路 这两道题看似毫无关系&#xff0c;但竟然可以用桶数组联系起来&#xff01;&#xff01; 先说打家劫舍这道题 限制条件是不能走相邻的屋&#xff0c;再联想到跳台阶&#xff08;走一格或两格&#xff09;&#x…

图解MCP:Model Context Protocol

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…

【网络】数据链路层知识梳理

全是通俗易懂的讲解&#xff0c;如果你本节之前的知识都掌握清楚&#xff0c;那就速速来看我的笔记吧~ 自己写自己的八股&#xff01;让未来的自己看懂&#xff01; &#xff08;全文手敲&#xff0c;受益良多&#xff09; 数据链路层 我们来重新理解一下这个图&#xff1a;…

积木报表查询出现jdbc.SQLServerException: 对象名 ‘user_tab_comment 的解决方法

目录 前言1. 问题所示2. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 使用帆软报表无错,后续使用积木报表查询出错: 没有显示报表: 具体错误信息如下:

数字孪生废气处理工艺流程

图扑数字孪生废气处理工艺流程系统。通过精准 3D 建模&#xff0c;对废气收集、预处理、净化、排放等全流程进行 1:1 数字化复刻&#xff0c;实时呈现设备运行参数、污染物浓度变化等关键数据。 借助图扑可视化界面&#xff0c;管理者可直观掌握废气处理各环节状态&#xff0c…

【某比特币网址请求头部sign签名】RSA加密逆向分析

目标&#xff1a;aHR0cDovL21lZ2FiaXQudmlwL21hcmtldA 直接搜索sign不方便定位&#xff0c;可以换个思路搜asi_uuid或者user_info 为什么搜这个&#xff0c;因为都是请求头里面的参数&#xff0c;基本上会在一起 实际上就是Object(h.a)((new Date).getTime()) 直接在这里打断点…

基于WebRTC技术的EasyRTC:支持任意平台设备的实时音视频通信解决方案

一、技术架构与核心优势 EasyRTC是一套基于WebRTC技术的实时音视频通信框架&#xff0c;旨在为开发者提供高效、稳定、跨平台的通信解决方案。其核心优势在于支持任意平台设备&#xff0c;包括Web端、移动端、桌面端和嵌入式设备&#xff0c;真正实现“一次开发&#xff0c;多…

DNS解析失败怎么解决?

在互联网时代&#xff0c;畅快地浏览网页、使用各类网络服务已成为生活常态。然而&#xff0c;当屏幕突然弹出 “DNS解析失败”的提示&#xff0c;原本顺畅的网络连接戛然而止&#xff0c;让人倍感困扰。DNS即域名系统&#xff0c;它如同互联网的 “电话簿”&#xff0c;负责将…

2025年4月19日

1.英语 1.单词 2.翻译 老年人食堂 In recent years, elderly population in China has continued to grow. The Chinese government is taking various measures to advance the construction of the elderly care service system and to make the later lives of the elde…

【Vue】组件通信(Props/Emit、EventBus、Provide/Inject)

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Vue 文章目录 1. Props/Emit 父子组件通信1.1 Props 向下传递数据1.2 Emit 向上传递事件 2. EventBus 跨组件通信2.1 创建事件总线2.2 使用事件总线2.3 EventBus 优缺点 3. Provide/Inject 深层组件通信3.1 基本使用3.2 响应式处…

QT实现串口透传的功能

在一些产品的开发的时候&#xff0c;需要将一个串口的数据发送给另外一个串口进行转发。 具体的代码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::Ma…

动态规划入门:背包问题求具体方案(以0-1背包问题为例)

本质&#xff1a;有向图最短&#xff08;长&#xff09;路问题 字典序最小方案&#xff1f;--贪心思路&#xff1f;&#xff08;本题未使用&#xff09; 分析第一个物品&#xff1a; 写代码时tip&#xff1a;要考虑“边读边做”还是“先读后做” #include<iostream> #i…

WEMOS LOLIN32 开发板引脚布局和技术规格

&#x1f517; 快速链接ESP32 Development Boards, Sensors, Tools, Projects and More https://megma.ma/wp-content/uploads/2021/08/Wemos-ESP32-Lolin32-Board-BOOK-ENGLISH.pdf WEMOS LOLIN32 Development Board Details, Pinout, Specs WEMOS LOLIN32 Development Board …

mysql中的group by用法详解

MySQL中的GROUP BY是数据聚合分析的核心功能&#xff0c;主要用于将结果集按指定列分组&#xff0c;并结合聚合函数进行统计计算。以下从基本语法到高级用法进行详细解析&#xff1a; 一、基本语法与核心功能 SELECT 分组列, 聚合函数(计算列) FROM 表名 [WHERE 条件] GROUP B…