当前位置: 首页 > 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;这一…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...