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系列的芯片系统安装有专门的软件,所有在系统安装方面比较简单。更多的还是我们应该怎么去编译系统,这一…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献
Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译: ### 胃肠道癌症的发病率呈上升趋势,且有年轻化倾向(Bray等人,2018&#x…...
SQL进阶之旅 Day 22:批处理与游标优化
【SQL进阶之旅 Day 22】批处理与游标优化 文章简述(300字左右) 在数据库开发中,面对大量数据的处理任务时,单条SQL语句往往无法满足性能需求。本篇文章聚焦“批处理与游标优化”,深入探讨如何通过批量操作和游标技术提…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...
