迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

在 C 语言中实现凯撒密码

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文将演示关于如何在 C 语言中实现凯撒密码的多种方法。


在 C 语言中实现凯撒密码处理常量字符串的方法

凯撒密码是一种最简单的加密方案,不能用于任何产品级的保密,而只是满足我们知识上的好奇心。凯撒本质上是具有给定位置数量的字母旋转技术。给定文本和位置 5,加密版本将包含右移 5 位的字符。请注意,旋转方向不是严格指定的,因为每种情况下都有其相反的旋转,从而得到相同的结果。

在下面的例子中,我们演示了如何加密硬编码的 string 文字。旋转位置取自用户输入,并检查数字是否在 [1,26]的区间内,因为这个例子只针对英文字母。接下来,我们执行 while 循环,在这个循环中,一个字符被检查是否有非字母值,然后才用给定的位置进行移位。这段代码只能处理小写字母,因为我们采用了代表 ASCII 编码中 a97 值。同时,我们直接将编码后的值逐个字符输出到控制台。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

const char *str = "arbitrary string to encode";

int main(void) {
    int shift;
    char num[16];

    printf("Choose shift number [1-26]: ");
    fflush(stdout);
    if (fgets(num, 16, stdin) == NULL)
        exit(EXIT_FAILURE);

    shift = (int) strtol(num, NULL, 0);
    if (shift < 1 || shift > 26) {
        fprintf(stderr, "Shift number is out of range");
        exit(EXIT_FAILURE);
    }

    while (*str) {
        if (!isspace(*str) || !isblank(*str))
            printf("%c", (((*str - 97) + shift) % 26) + 97);
        else
            printf("%c", *str);
        str += 1;
    }

    exit(EXIT_SUCCESS);
}

在 C 语言中实现凯撒密码来处理用户提供的字符串

另外,我们也可以重新实现之前的代码示例,从用户输入的文本和旋转位置中获取文本和旋转位置,验证它们,并对给定的字符串进行加密。与前一个例子相比,这个版本包括两个 fgets 调用和 malloc 来为明文分配动态内存。这个实现还处理了小写的字符串,将无法正确加密混合字符串。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

enum {MAX_LEN = 1024};

int main(void) {
    size_t len;
    int shift;
    char *text;
    char num[16];

    text = malloc(MAX_LEN);
    if (text == NULL) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }

    printf("Input text to be encrypted (lowercase): ");
    fflush(stdout);
    if (fgets(text, MAX_LEN, stdin) == NULL)
        exit(EXIT_FAILURE);

    len = strlen(text);
    if (text[len - 1] == '\n')
        text[len - 1] = '\0';
    len -= 1;

    printf("Choose shift number [1-26]: ");
    fflush(stdout);
    if (fgets(num, 16, stdin) == NULL)
        exit(EXIT_FAILURE);

    shift = (int) strtol(num, NULL, 0);
    if (shift < 1 || shift > 26) {
        fprintf(stderr, "Shift number is out of range");
        exit(EXIT_FAILURE);
    }

    for (int i = 0; i < len; ++i) {
        if (!isspace(text[i]) || !isblank(text[i]))
            printf("%c", (((text[i] - 97)+shift)%26)+97);
        else
            printf("%c", text[i]);
    }

    exit(EXIT_SUCCESS);
}

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便