当前位置: 首页 > news >正文

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;
}

测试用例和步骤

  1. 运行程序。
  2. 输入要加密的文本,例如 “Hello, World!”。
  3. 输入一个有效的移位数,例如 3。
  4. 检查输出的加密文本是否正确,例如对于移位3,应得到 “Khoor, Zruog!”。
  5. 检查解密后的文本是否与原始文本相同。

运行截图

请添加图片描述请添加图片描述

注意事项

  • 程序假设输入文本不会超过99个字符。
  • 程序只处理英文字符,非字母字符保持不变。
  • 使用fgets来读取包含空格的字符串,而strcspn用于去除末尾的换行符。
  • decrypt函数实际上调用了encrypt函数,但使用了相反的移位数来实现解密。

这个程序可以作为一个基础示例,你可以根据需要添加更多的功能或改进错误处理逻辑。

核心代码加密逻辑

移位密码(凯撒密码)的核心思路。

移位密码的基本概念

移位密码是一种简单的替换加密方法。它通过将字母表中的每个字母向前或向后移动固定数量的位置来进行加密。例如,如果移位数是3,那么A会被替换成D,B会替换成E,以此类推。对于字母表的末尾,Z会绕回到A继续计算。

实现步骤

  1. 遍历字符串

    • 你需要逐个检查输入文本中的每一个字符。
    • 如果遇到非字母字符(如空格、标点符号等),则保持不变。
    • 如果遇到字母字符,则进行移位操作。
  2. 处理大小写

    • 英文有大写字母和小写字母,所以需要分别处理。
    • 大写字母从’A’到’Z’,小写字母从’a’到’z’。
    • 为了方便处理,我们可以先确定当前字母是大写还是小写,然后基于相应的基准字母(大写是’A’,小写是’a’)进行移位。
  3. 计算新的字符位置

    • 计算当前字母与基准字母之间的距离。
    • 加上移位数。
    • 使用模运算(% 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; // 计算新的字符位置}
}
逐行解释
  1. 遍历字符串

    for (int i = 0; text[i] != '\0'; ++i) {
    
    • 这一行代码使用for循环遍历字符串text中的每个字符,直到遇到字符串结束符\0
  2. 只处理字母字符

    if (isalpha(text[i])) {
    
    • isalpha函数检查当前字符是否为字母。如果是字母,进入花括号内的代码块;如果不是,跳过该字符。
  3. 确定基准字母

    char base = isupper(text[i]) ? 'A' : 'a';
    
    • isupper函数检查当前字符是否为大写字母。
    • 如果是大写字母,base设置为'A';如果是小写字母,base设置为'a'
    • 这样可以确保我们对大写和小写字母分别进行正确的移位。
  4. 计算新的字符位置

    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

在这里插入图片描述

在这里插入图片描述

  1. isalpha(c)

    • 返回值:isalpha()函数返回一个非零值(通常为1),如果参数c位于范围’A-Z’或’a-z’内。这意味着c是一个英文字母。
    • 参数:c是要测试的整数值。
    • 依赖性:isalpha()的结果取决于当前locale(区域设置)的LC_CTYPE类别设置。可以通过setlocale()函数更改locale设置。
  2. iswalpha(c)

    • 返回值:iswalpha()函数仅在满足以下条件的情况下返回非零值:c是一个宽字符,且iswupper()iswlower()也为真。也就是说,c是一个由实现定义的集合中的任何宽字符,对于这些字符,iswcntrl(), iswdigit(), ispunct(), 或 isspace()都不为真。
    • 参数:c是要测试的宽字符。
    • 依赖性:iswalpha()的结果独立于locale,不受locale影响。

这两个函数都返回0,如果参数c不满足测试条件。

相关文章:

C语言实现简单凯撒密码算法

**实验2&#xff1a;传统密码技术 【实验目的】 通过本次实训内容&#xff0c;学习常见的传统密码技术&#xff0c;通过编程实现简单代替密码中的移位密码算法&#xff0c;加深对传统密码技术的了解&#xff0c;为深入学习密码学奠定基础。【技能要求】 分析简单代替密码中的移…...

多态的使用和原理(c++详解)

一、多态的概念 多态顾名思义就是多种形态&#xff0c;它分为编译时的多态&#xff08;静态多态&#xff09;和运行时的多态&#xff08;动态多态&#xff09;&#xff0c;编译时多态&#xff08;静态多态&#xff09;就是函数重载&#xff0c;模板等&#xff0c;通过不同的参数…...

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Trace调测】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 基本概念 Trace调测旨在帮助开发者获取内核的运行流程&#xff0c…...

Lombok 在 IntelliJ IDEA 中的使用步骤

Lombok 是一个非常流行的 Java 库&#xff0c;它通过注解简化 Java 类的开发&#xff0c;特别是在处理 POJO&#xff08;Plain Old Java Objects&#xff09;类时&#xff0c;如生成 getter、setter、toString 等常用方法。Lombok 在减少样板代码&#xff08;boilerplate code&…...

计算机网络 --- Socket 编程

序言 在上一篇文章中&#xff0c;我们介绍了 协议&#xff0c;协议就是一种约定&#xff0c;规范了双方通信需要遵循的规则、格式和流程&#xff0c;以确保信息能够被准确地传递、接收和理解。  在这篇文章中我们将介绍怎么进行跨网络数据传输&#xff0c;在这一过程中相信大家…...

git笔记之在多个分支中复用某个分支提交的更改

git笔记之在多个分支中复用某个分支提交的更改 code review! 文章目录 git笔记之在多个分支中复用某个分支提交的更改1.实现该功能的 Bash 脚本示例2.这个脚本是否可以处理新添加的文件&#xff1f;3.该脚本使用前&#xff0c;应先使用下述脚本重置本地仓库所有分支与远程保持一…...

HTML、CSS

初识web前端 web标准 Web标准也称为网页标准&#xff0c;由一系列的标准组成&#xff0c;大部分由W3C (World Wide Web Consortium&#xff0c;万维网联盟) 负责制定。三个组成部分: HTML: 负责网页的结构(页面元素和内容)。CSS: 负责网页的表现(页面元素的外观、位置等页面样…...

数据文件(0)

一、使用场景 1、字典数据 对于一些数据量不大的配置类数据&#xff0c;放到数据库中占用数据库资源&#xff0c;可以放到代码中维护。比如 &#xff08;1&#xff09;字段少业务单一&#xff1a;做成枚举&#xff1b; &#xff08;2&#xff09;字段多业务复杂&#xff1a…...

Go语言并发模式详解:深入理解管道与上下文的高级用法

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在Go语言中,并发编程是其最强大的特性之一。合理地使用并发模式,可以让我们的程序高效而优雅地处理复杂的任务。在本文中,我们将深入探讨Go语言中的一些高级并发模式,包括管道的技巧和上下文包的应用。通过丰…...

标准文档流解析及 CSS 中的相关特性

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 标准文档流特点 空白折叠现象 高矮不齐、底边对齐 自动换行,一行写不满,换行写 标准文档流中的元素等级 HTML 与 CSS 中的标签分类总结 块级元素和行内元素的相互转换 块级转行内 行内转块级 display 非 VIP…...

水下攻防面试题

水下攻防面试题通常涉及对水下环境的理解、水下安全操作、水下技术应用以及攻防策略等多个方面。由于具体的面试题可能因组织、职位和目的的不同而有所差异,以下是一些可能出现在水下攻防面试中的典型问题及其参考答案框架: 一、基础概念与理解 什么是水下攻防? 水下攻防是…...

vmware 虚拟机多屏幕或添加屏幕

vmware 虚拟机多屏幕或添加屏幕 前置条件 vmware 安装 vmware tools 虚拟机系统支持多屏幕 物理上有至少两个屏幕&#xff0c;就是物理机上接至少一个屏幕 方法 虚拟机上点设置&#xff0c;需要在虚拟机关机时进行 ctrl alt enter 让当前虚拟机全屏 鼠标移动到屏幕虚拟机…...

鹏哥C语言49-51---第6次作业:循环语句 for 和 while

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //-----------------------------------------------------------------------------------------------第六次作业&#xff1a;for循环等 //--------------------------------------------------------------------…...

springboot中药材进存销管理系统

基于springbootvue实现的中药材进存销管理系统 &#xff08;源码L文ppt&#xff09;4-079 4 系统总体设计 4.1系统功能结构设计图 根据需求说明设计系统各功能模块。采用模块化设计方法实现一个复杂结构进行简化&#xff0c;分成一个个小的容易解决的板块&#xff0c;然…...

GitHub上图像超分开源项目推荐【持续更新】

SRCNN 介绍&#xff1a;SRCNN&#xff08;Super-Resolution Convolutional Neural Network&#xff09;是一种用于图像超分辨率的卷积神经网络。它由Dong等人在2014年提出&#xff0c;是早期的深度学习方法之一&#xff0c;用于提高图像的分辨率。SRCNN通过学习低分辨率&#…...

浅谈软件测试的基础知识(1)

文章目录 一、什么是测试1.1、生活中的测试案例1.2、为什么需要进行软件测试 二、测试和开发的区别2.1、调试和测试的区别 四、测试人员需具备哪些素质五、软件的生命周期六、软件测试的生命周期七、设计测试用例的方法[!]7.1、什么是测试用例7.2、测试用例作用 八、走测试岗位…...

Mac 上哪个剪切板增强工具比较好用? 好用剪切板工具推荐

在日常文字编辑中&#xff0c;我们经常需要重复使用复制的内容。然而&#xff0c;新内容一旦复制&#xff0c;旧内容就会被覆盖。因此&#xff0c;选择一款易用高效的剪贴板工具成为了许多人的需求。本文整理了一些适用于 macOS 系统的优秀剪贴板增强工具&#xff0c;欢迎大家下…...

基于opencv的车牌检测和识别系统(代码+教程)

车牌检测与识别技术详解 车牌检测和识别&#xff08;License Plate Recognition, LPR&#xff09;是一项重要的计算机视觉任务&#xff0c;它在交通管理、安全监控以及智能门禁系统等多个领域都有着广泛的应用。随着深度学习技术的发展&#xff0c;LPR系统的准确性和鲁棒性得到…...

list(二) (list模拟实现)

首先进行大框架 先写基本的结点类 有data next prev template<class T>class ListNode//或者使用struct 就不用在写public声明公有{public://这里不仅仅是成员函数 成员变量也要公有化 ListNode<T>* _next;ListNode<T>* _prev;T _data;}之后是链表list类…...

[Linux]从零开始的泰山派系统安装与远程教程

一、前言 泰山派买回来也有一阵子了&#xff0c;最近慢慢开始研究。当然&#xff0c;学习这种Linux的开发板的第一步就是安装系统&#xff0c;对于RK系列的芯片系统安装有专门的软件&#xff0c;所有在系统安装方面比较简单。更多的还是我们应该怎么去编译系统&#xff0c;这一…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...