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

news2024/9/24 13:15:18
  • **实验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不满足测试条件。

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

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

相关文章

R语言机器学习遥感数据处理与模型空间预测技术及实际项目案例分析

随机森林作为一种集成学习方法&#xff0c;在处理复杂数据分析任务中特别是遥感数据分析中表现出色。通过构建大量的决策树并引入随机性&#xff0c;随机森林在降低模型方差和过拟合风险方面具有显著优势。在训练过程中&#xff0c;使用Bootstrap抽样生成不同的训练集&#xff…

LeetCode 每日一题 ---- 【2207. 字符串中最多数目的子序列】

LeetCode 每日一题 ---- 【2207. 字符串中最多数目的子序列】 2207.字符串中最多数目的子序列方法&#xff1a;贪心 一次遍历 2207.字符串中最多数目的子序列 方法&#xff1a;贪心 一次遍历 从题意中可以看出来&#xff0c;对于 pattern.charAt(0) 一定是插入到最左侧是最优…

什么是SSL证书?它能保护你的网络安全!

相信大家在浏览网页时经常会看到一些网址前面有个“小锁”图标&#xff0c;它代表的网站是安全的&#xff0c;而这背后的秘密就是SSL证书。那SSL证书到底是什么&#xff1f;它有什么用呢&#xff1f; 什么是SSL证书&#xff1f; SSL证书的全称是Secure Sockets Layer证书&…

php发送邮箱教程:如何实现邮件发送功能?

php发送邮箱性能优化策略&#xff1f;怎么使用PHPMail发送邮箱&#xff1f; 无论是用户注册验证、密码重置&#xff0c;还是系统通知&#xff0c;邮件发送都是不可或缺的一部分。AokSend将详细介绍如何使用PHP实现邮件发送功能&#xff0c;帮助开发者快速掌握这一技能。 php发…

高效驱动,掌控动力:TB67H400AFNG 马达驱动器

在如今智能设备和自动化应用领域中&#xff0c;驱动器的性能直接决定了系统的可靠性与效率。东芝的TB67H400AFNG有刷直流马达驱动器凭借其卓越的性能&#xff0c;成为众多行业解决方案中的关键部件。无论是工业控制、自动化设备还是消费类电子产品&#xff0c;TB67H400AFNG都能…

一小时拿下鸿蒙应用开发者高级证书!(二)

鸿蒙应用开发者高级认证&#xff0c;是华为自家研发的硬核操作系统&#xff0c;现在它在市场上的名声也越来越响亮。你手上要是有了鸿蒙的认证小本本&#xff0c;那就等于是掌握了这行里的独门秘籍&#xff0c;找工作的时候&#xff0c;妥妥的加分项。 一个小时刷刷题&#xf…

玩机进阶教程----MTK芯片杂牌机 小品牌机型以及其他mtk设备导出分区的另外一种方法解析

在前面多期博文中都是通过工具来导出分区 制作线刷包的。今天我们以另外一种方法备份系统分区。mtk芯片较多。具体机型适合哪种方法需要自测。多种方法多条思路。遇到机型善用工具。目前一些wifi网卡 点读笔以及有些其他mtk芯片设备。通常分区都较小。可以参考教程 通过教程了…

amr文件怎么转换成mp3?这几种方法超多人在用!

amr文件怎么转换成mp3&#xff1f;AMR音频格式&#xff0c;作为音频领域的一个相对边缘角色&#xff0c;其应用范围相对狭窄&#xff0c;这背后深藏着多重内在限制&#xff0c;首要挑战在于AMR的音质瓶颈&#xff0c;它难以逃脱声音失真与杂音干扰的阴影&#xff0c;这对于追求…

通过企业微信群机器人 发送群消息

1、添加群机器人&#xff0c;复制的webhook地址 2、 public static void main(String[] args) { String reqUrl "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key6xdexxxxxxxxxxxxxxxxxxxxxxxxxxx"; String title "填…

数据结构 - 查找算法

一.查找的概念 二.顺序表查找 特点&#xff1a; 1.记录的数据可以是无序的 2.当数据量较大时&#xff0c;查找效率低&#xff0c;需要依次遍历 /*** description: 顺序表查找算法&#xff0c;从后往前查找* param - a : 要操作的数组的指针* param - k…

OpenCV_自定义线性滤波(filter2D)应用详解

OpenCV filter2D将图像与内核进行卷积&#xff0c;将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时&#xff0c;该函数根据指定的边界模式插值异常像素值。 卷积核本质上是一个固定大小的系数数组&#xff0c;数组中的某个元素被作为锚点&#xff08;一般…

安霸cv22平台移植采坑记录

主要分为3部分&#xff1a; 1.数据输入部分&#xff1a; 1.因原始测试代码只是单张测试图片&#xff08;测试格式&#xff1a;安霸平台离线转的bin文件&#xff09;&#xff0c;现在的问题是&#xff1a;如何输入数据流&#xff1f;会不会涉及到字节对齐问题&#xff0c;如何…

ROS第六梯:ROS+VSCode+C++消息发布和订阅

第一步&#xff1a;创建ROS工作空间&#xff0c;并在工作空间下创建名为srr_pkg的功能包&#xff0c;具体步骤参考第二章。 第二步&#xff1a;在src下创建publisher.cpp作为发布节点代码文件&#xff0c;创建subscriber.cpp作为订阅节点代码文件&#xff1a; 主要步骤是&#…

这几个方法轻松压缩ppt文件大小,操作起来很简单的压缩PPT方法

这几个方法轻松压缩ppt文件大小。在当今信息化迅速发展的时代&#xff0c;PPT已成为工作和学习中必不可少的工具。然而&#xff0c;随着内容的增加&#xff0c;文件体积常常变得庞大&#xff0c;影响了分享和传输的便利性。过大的文件不仅占用存储空间&#xff0c;还可能导致演…

Nat Med|机器学习+高通量筛选,发现用于治疗胶质母细胞瘤的神经活性药物|顶刊精析·24-09-23

小罗碎碎念 今日顶刊&#xff1a;Nat Med 这篇文章是2024-09-20发表在《Nature Medicine》上的一篇研究型论文&#xff0c;标题为“High-throughput identification of repurposable neuroactive drugs with potent anti-glioblastoma activity”。 先打个提前量&#xff0c;发…

Java刷题知识总结(一)

1.局部变量参与运算前是必须要初始化的&#xff0c;比如下面的代码就会编译出错&#xff0c;提示y必须要初始化。 public static void main(String[] args) {int x 1;int y;int z x y; } 2.ArrayList和Vector主要区别是什么&#xff1f; A Vector与ArrayList一样&#xf…

Win11+cuda11.7+spconv11.7搭建OpenPCdet

这里写自定义目录标题 前面詳細的教程參考&#xff1a;https://blog.csdn.net/xuegreat1/article/details/141892867 懶得寫了&#xff0c;先寫遇到的一些教程外的bug&#xff1a; 上文教程走完后運行demo.py&#xff0c;但是發現沒有裝mayavi庫&#xff0c;直接安裝報錯&#…

【STM32】PWM

一、 PWM 概述 定义 PWM&#xff08;Pulse Width Modulation&#xff09;&#xff0c; 脉冲宽度调制。 脉冲&#xff1a; 方波&#xff0c; 频率(freq) 宽度&#xff1a; 高电平的宽度&#xff0c; 占空比(duty) ​ 详细波形如下图。 用途 控制灯光的亮度&#xff08;手机/平…

ASP.NET Core8.0学习笔记(十九)——EF Core DbSet

一、DbSet概述 1.DbSet提供了通过DbContext对表进行查询操作的路径。DbSet对应的属性名称将默认映射为实体T的表名。 2.使用DbSet<T>进行查询的方法&#xff1a; (1)直接在DbContext中创建对应的DbSet<T>属性 (2)使用DbSet DbContext.Set<T>方法操作数据表。…

红外图像绝缘子识别数据集

红外图像绝缘子识别数据集&#xff0c;数据集一共919张图片&#xff0c;标注为voc格式&#xff0c;可以转yolo格式 数据集名称 红外图像绝缘子识别数据集 (Infrared Insulator Recognition Dataset, IIRD) 数据集描述 IIRD是一个专为电气工程领域设计的小规模红外图像数据集…