C语言实现简单凯撒密码算法
- **实验2:传统密码技术 【实验目的】 通过本次实训内容,学习常见的传统密码技术,通过编程实现简单代替密码中的移位密码算法,加深对传统密码技术的了解,为深入学习密码学奠定基础。
- 【技能要求】
- 分析简单代替密码中的移位密码算法的功能需求,详细设计实现简单代替密码中的移位密码算法的数据结构和流程,给出测试用例和测试步骤,得出测试和结论。
- 简单代替密码中的移位密码算法必须提供加密和解密两个接口:int encrypt()和int decrypt()。当加密或者解密成功时,返回CRYPT_OK,失败时返回CRYPT_ERROR。
- 【实验内容】
- 利用自己熟悉的程序设计语言,实现简单代替密码中的移位密码。要求程序给出源代码以及相应的注释,实验结果截图。**
根据实验要求,我们将实现一个简单的移位密码(也称为凯撒密码)算法。这种加密方法是通过将字母表中的每个字母向前或向后移动固定数量的位置来进行加密和解密的。例如,如果移位数为3,那么A会被替换为D,B会变成E,以此类推。
规范代码演示
#include <stdio.h>
#include <string.h>
#include <ctype.h>#define CRYPT_OK 0
#define CRYPT_ERROR -1// 加密函数
int encrypt(char *text, int shift) {if (shift < 0 || shift > 25) {return CRYPT_ERROR; // 移位数必须在0到25之间}for (int i = 0; text[i] != '\0'; ++i) {if (isalpha(text[i])) { // 只处理字母字符char base = isupper(text[i]) ? 'A' : 'a';text[i] = ((text[i] - base + shift) % 26) + base; // 计算新的字符位置}}return CRYPT_OK;
}// 解密函数
int decrypt(char *text, int shift) {return encrypt(text, 26 - (shift % 26)); // 解密就是使用相反方向的移位
}int main() {char text[100];int shift;// 获取用户输入的文本printf("请输入要加密的文本: ");fgets(text, sizeof(text), stdin);text[strcspn(text, "\n")] = 0; // 去掉换行符// 获取移位数printf("请输入移位数(0-25): ");if (scanf("%d", &shift) != 1 || shift < 0 || shift > 25) {printf("无效的移位数。\n");return CRYPT_ERROR;}// 加密if (encrypt(text, shift) == CRYPT_OK) {printf("加密后的文本: %s\n", text);} else {printf("加密失败。\n");return CRYPT_ERROR;}// 解密if (decrypt(text, shift) == CRYPT_OK) {printf("解密后的文本: %s\n", text);} else {printf("解密失败。\n");return CRYPT_ERROR;}return 0;
}
测试用例和步骤
- 运行程序。
- 输入要加密的文本,例如 “Hello, World!”。
- 输入一个有效的移位数,例如 3。
- 检查输出的加密文本是否正确,例如对于移位3,应得到 “Khoor, Zruog!”。
- 检查解密后的文本是否与原始文本相同。
运行截图


注意事项
- 程序假设输入文本不会超过99个字符。
- 程序只处理英文字符,非字母字符保持不变。
- 使用
fgets来读取包含空格的字符串,而strcspn用于去除末尾的换行符。 decrypt函数实际上调用了encrypt函数,但使用了相反的移位数来实现解密。
这个程序可以作为一个基础示例,你可以根据需要添加更多的功能或改进错误处理逻辑。
核心代码加密逻辑
移位密码(凯撒密码)的核心思路。
移位密码的基本概念
移位密码是一种简单的替换加密方法。它通过将字母表中的每个字母向前或向后移动固定数量的位置来进行加密。例如,如果移位数是3,那么A会被替换成D,B会替换成E,以此类推。对于字母表的末尾,Z会绕回到A继续计算。
实现步骤
-
遍历字符串:
- 你需要逐个检查输入文本中的每一个字符。
- 如果遇到非字母字符(如空格、标点符号等),则保持不变。
- 如果遇到字母字符,则进行移位操作。
-
处理大小写:
- 英文有大写字母和小写字母,所以需要分别处理。
- 大写字母从’A’到’Z’,小写字母从’a’到’z’。
- 为了方便处理,我们可以先确定当前字母是大写还是小写,然后基于相应的基准字母(大写是’A’,小写是’a’)进行移位。
-
计算新的字符位置:
- 计算当前字母与基准字母之间的距离。
- 加上移位数。
- 使用模运算(% 26)来确保结果在0到25之间。
- 最后再加上基准字母,得到新的字符。
代码详解
下面是对核心代码的进一步简化解释:
for (int i = 0; text[i] != '\0'; ++i) {if (isalpha(text[i])) { // 只处理字母字符char base = isupper(text[i]) ? 'A' : 'a';text[i] = ((text[i] - base + shift) % 26) + base; // 计算新的字符位置}
}
逐行解释
-
遍历字符串:
for (int i = 0; text[i] != '\0'; ++i) {- 这一行代码使用
for循环遍历字符串text中的每个字符,直到遇到字符串结束符\0。
- 这一行代码使用
-
只处理字母字符:
if (isalpha(text[i])) {isalpha函数检查当前字符是否为字母。如果是字母,进入花括号内的代码块;如果不是,跳过该字符。
-
确定基准字母:
char base = isupper(text[i]) ? 'A' : 'a';isupper函数检查当前字符是否为大写字母。- 如果是大写字母,
base设置为'A';如果是小写字母,base设置为'a'。 - 这样可以确保我们对大写和小写字母分别进行正确的移位。
-
计算新的字符位置:
text[i] = ((text[i] - base + shift) % 26) + base;text[i] - base:计算当前字符与基准字母之间的距离。例如,如果text[i]是'D'且base是'A',那么'D' - 'A'等于3。+ shift:加上移位数。例如,如果shift是3,那么3 + 3等于6。% 26:取模26,以确保结果在0到25之间。这样可以处理移位超过字母表长度的情况。+ base:再加上基准字母base,得到最终的新字符。例如,如果base是'A',那么6 + 'A'就是'G'。- 最终,
text[i]被替换为新的字符。
示例
假设text是 “Hello”,shift是3:
- 对于
H(ASCII 72),base是'A'(ASCII 65),72 - 65 + 3等于10,10 % 26等于10,10 + 65等于75,所以H变成K。 - 对于
e(ASCII 101),base是'a'(ASCII 97),101 - 97 + 3等于7,7 % 26等于7,7 + 97等于104,所以e变成h。 - 其他字符类似处理。
最终,“Hello"加密后会变成"Khoor”。
这个过程对于解密也是类似的,只是移位的方向相反。
附加
关于isalpha, iswalpha


-
isalpha(c)- 返回值:
isalpha()函数返回一个非零值(通常为1),如果参数c位于范围’A-Z’或’a-z’内。这意味着c是一个英文字母。 - 参数:
c是要测试的整数值。 - 依赖性:
isalpha()的结果取决于当前locale(区域设置)的LC_CTYPE类别设置。可以通过setlocale()函数更改locale设置。
- 返回值:
-
iswalpha(c)- 返回值:
iswalpha()函数仅在满足以下条件的情况下返回非零值:c是一个宽字符,且iswupper()或iswlower()也为真。也就是说,c是一个由实现定义的集合中的任何宽字符,对于这些字符,iswcntrl(),iswdigit(),ispunct(), 或isspace()都不为真。 - 参数:
c是要测试的宽字符。 - 依赖性:
iswalpha()的结果独立于locale,不受locale影响。
- 返回值:
这两个函数都返回0,如果参数c不满足测试条件。
相关文章:
C语言实现简单凯撒密码算法
**实验2:传统密码技术 【实验目的】 通过本次实训内容,学习常见的传统密码技术,通过编程实现简单代替密码中的移位密码算法,加深对传统密码技术的了解,为深入学习密码学奠定基础。【技能要求】 分析简单代替密码中的移…...
多态的使用和原理(c++详解)
一、多态的概念 多态顾名思义就是多种形态,它分为编译时的多态(静态多态)和运行时的多态(动态多态),编译时多态(静态多态)就是函数重载,模板等,通过不同的参数…...
OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Trace调测】
往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 Trace调测旨在帮助开发者获取内核的运行流程,…...
Lombok 在 IntelliJ IDEA 中的使用步骤
Lombok 是一个非常流行的 Java 库,它通过注解简化 Java 类的开发,特别是在处理 POJO(Plain Old Java Objects)类时,如生成 getter、setter、toString 等常用方法。Lombok 在减少样板代码(boilerplate code&…...
计算机网络 --- Socket 编程
序言 在上一篇文章中,我们介绍了 协议,协议就是一种约定,规范了双方通信需要遵循的规则、格式和流程,以确保信息能够被准确地传递、接收和理解。 在这篇文章中我们将介绍怎么进行跨网络数据传输,在这一过程中相信大家…...
git笔记之在多个分支中复用某个分支提交的更改
git笔记之在多个分支中复用某个分支提交的更改 code review! 文章目录 git笔记之在多个分支中复用某个分支提交的更改1.实现该功能的 Bash 脚本示例2.这个脚本是否可以处理新添加的文件?3.该脚本使用前,应先使用下述脚本重置本地仓库所有分支与远程保持一…...
HTML、CSS
初识web前端 web标准 Web标准也称为网页标准,由一系列的标准组成,大部分由W3C (World Wide Web Consortium,万维网联盟) 负责制定。三个组成部分: HTML: 负责网页的结构(页面元素和内容)。CSS: 负责网页的表现(页面元素的外观、位置等页面样…...
数据文件(0)
一、使用场景 1、字典数据 对于一些数据量不大的配置类数据,放到数据库中占用数据库资源,可以放到代码中维护。比如 (1)字段少业务单一:做成枚举; (2)字段多业务复杂:…...
Go语言并发模式详解:深入理解管道与上下文的高级用法
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在Go语言中,并发编程是其最强大的特性之一。合理地使用并发模式,可以让我们的程序高效而优雅地处理复杂的任务。在本文中,我们将深入探讨Go语言中的一些高级并发模式,包括管道的技巧和上下文包的应用。通过丰…...
标准文档流解析及 CSS 中的相关特性
目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 标准文档流特点 空白折叠现象 高矮不齐、底边对齐 自动换行,一行写不满,换行写 标准文档流中的元素等级 HTML 与 CSS 中的标签分类总结 块级元素和行内元素的相互转换 块级转行内 行内转块级 display 非 VIP…...
水下攻防面试题
水下攻防面试题通常涉及对水下环境的理解、水下安全操作、水下技术应用以及攻防策略等多个方面。由于具体的面试题可能因组织、职位和目的的不同而有所差异,以下是一些可能出现在水下攻防面试中的典型问题及其参考答案框架: 一、基础概念与理解 什么是水下攻防? 水下攻防是…...
vmware 虚拟机多屏幕或添加屏幕
vmware 虚拟机多屏幕或添加屏幕 前置条件 vmware 安装 vmware tools 虚拟机系统支持多屏幕 物理上有至少两个屏幕,就是物理机上接至少一个屏幕 方法 虚拟机上点设置,需要在虚拟机关机时进行 ctrl alt enter 让当前虚拟机全屏 鼠标移动到屏幕虚拟机…...
鹏哥C语言49-51---第6次作业:循环语句 for 和 while
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //-----------------------------------------------------------------------------------------------第六次作业:for循环等 //--------------------------------------------------------------------…...
springboot中药材进存销管理系统
基于springbootvue实现的中药材进存销管理系统 (源码L文ppt)4-079 4 系统总体设计 4.1系统功能结构设计图 根据需求说明设计系统各功能模块。采用模块化设计方法实现一个复杂结构进行简化,分成一个个小的容易解决的板块,然…...
GitHub上图像超分开源项目推荐【持续更新】
SRCNN 介绍:SRCNN(Super-Resolution Convolutional Neural Network)是一种用于图像超分辨率的卷积神经网络。它由Dong等人在2014年提出,是早期的深度学习方法之一,用于提高图像的分辨率。SRCNN通过学习低分辨率&#…...
浅谈软件测试的基础知识(1)
文章目录 一、什么是测试1.1、生活中的测试案例1.2、为什么需要进行软件测试 二、测试和开发的区别2.1、调试和测试的区别 四、测试人员需具备哪些素质五、软件的生命周期六、软件测试的生命周期七、设计测试用例的方法[!]7.1、什么是测试用例7.2、测试用例作用 八、走测试岗位…...
Mac 上哪个剪切板增强工具比较好用? 好用剪切板工具推荐
在日常文字编辑中,我们经常需要重复使用复制的内容。然而,新内容一旦复制,旧内容就会被覆盖。因此,选择一款易用高效的剪贴板工具成为了许多人的需求。本文整理了一些适用于 macOS 系统的优秀剪贴板增强工具,欢迎大家下…...
基于opencv的车牌检测和识别系统(代码+教程)
车牌检测与识别技术详解 车牌检测和识别(License Plate Recognition, LPR)是一项重要的计算机视觉任务,它在交通管理、安全监控以及智能门禁系统等多个领域都有着广泛的应用。随着深度学习技术的发展,LPR系统的准确性和鲁棒性得到…...
list(二) (list模拟实现)
首先进行大框架 先写基本的结点类 有data next prev template<class T>class ListNode//或者使用struct 就不用在写public声明公有{public://这里不仅仅是成员函数 成员变量也要公有化 ListNode<T>* _next;ListNode<T>* _prev;T _data;}之后是链表list类…...
[Linux]从零开始的泰山派系统安装与远程教程
一、前言 泰山派买回来也有一阵子了,最近慢慢开始研究。当然,学习这种Linux的开发板的第一步就是安装系统,对于RK系列的芯片系统安装有专门的软件,所有在系统安装方面比较简单。更多的还是我们应该怎么去编译系统,这一…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
