C语言经典算法之凯撒加密

目录

前言

A.建议

B.简介

一 代码实现

二 时空复杂度

A.时间复杂度(Time Complexity):

B.空间复杂度(Space Complexity):

C.总结:

三 优缺点


前言

A.建议

1.学习算法最重要的是理解算法的每一步,而不是记住算法。

2.建议读者学习算法的时候,自己手动一步一步地运行算法。

B.简介

凯撒加密(Caesar Cipher)是一种简单的替换式加密方法,由古罗马的朱利斯·凯撒首先使用,因此得名。它是通过将明文中每个字母按照字母表向后(或向前)移动固定数量的位置来实现加密。

一 代码实现

在C语言中,我们可以编写一个简单的程序来实现这一加密算法,以下是一个基础的凯撒加密函数示例,假设仅针对大写或小写字母,并且偏移量固定为3:

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

// 函数声明
void caesar_encrypt(char *input, char *output, int shift);
void caesar_decrypt(char *input, char *output, int shift);

// 函数实现
void caesar_encrypt(char *plaintext, char *ciphertext, int shift) {
    while (*plaintext != '\0') {
        if (isalpha(*plaintext)) { // 检查字符是否为字母
            char base;
            if (islower(*plaintext)) { // 处理小写字母
                base = 'a';
            } else if (isupper(*plaintext)) { // 处理大写字母
                base = 'A';
            }
            // 加密:计算新字母的位置并循环至正确区间
            *ciphertext = ((*(plaintext++) - base + shift) % 26) + base;
        } else {
            *ciphertext = *plaintext++; // 非字母字符原样复制
        }
        ciphertext++;
    }
    *ciphertext = '\0'; // 添加结束符
}

void caesar_decrypt(char *ciphertext, char *plaintext, int shift) {
    // 解密其实就是加密操作的逆向操作,即偏移量取负值
    caesar_encrypt(ciphertext, plaintext, -shift);
}

int main() {
    char plaintext[] = "HELLO WORLD";
    char ciphertext[strlen(plaintext) + 1];
    char decrypted[strlen(plaintext) + 1];

    printf("原文: %s\n", plaintext);

    // 使用偏移量3进行加密
    caesar_encrypt(plaintext, ciphertext, 3);
    printf("密文: %s\n", ciphertext);

    // 使用相同的偏移量3进行解密
    caesar_decrypt(ciphertext, decrypted, 3);
    printf("解密后: %s\n", decrypted);

    return 0;
}

这个程序定义了两个函数 caesar_encryptcaesar_decrypt,分别用于加密和解密字符串。加密时,程序遍历输入字符串,遇到字母时将其与字母表基准('A' 或 'a')作差,加上偏移量并求模26以保持在字母表范围内。非字母字符则直接复制到输出字符串。解密时只需调用加密函数但传入负偏移量即可。

注意:此代码没有处理大写和小写字母混合的情况,如果需要同时支持大小写字母并且大小写字母各自独立偏移,可以修改代码逻辑以适应不同情况。此外,实际应用中还应考虑更多边界条件和错误处理机制。

二 时空复杂度

凯撒加密算法的时间复杂度和空间复杂度都非常简单:

A.时间复杂度(Time Complexity)

凯撒加密的时间复杂度为O(n),其中n为待加密字符串的长度。因为算法是对字符串中的每个字符进行逐一处理,无论是加密还是解密,都需要遍历整个字符串,因此时间复杂度与字符串长度成线性关系。

B.空间复杂度(Space Complexity)

凯撒加密的空间复杂度为O(1)(或O(n),取决于是否包括输出缓冲区)。在最基本的实现中,算法仅需少量固定大小的临时存储空间,如用于计算和存放加密后的字符。如果加密后的字符串需要单独存储,那么还需要额外的空间来存储加密结果,这种情况下空间复杂度将与原始字符串长度相同,即O(n)。但如果仅在原地修改输入字符串,忽略输出缓冲区,空间复杂度则是固定的,即O(1)

C.总结:

总结:

  • 时间复杂度:O(n)
  • 空间复杂度:O(1) 或 O(n),取决于是否需要单独存储加密后的字符串。

三 优缺点

A.优点:

  1. 简单易懂:凯撒加密算法非常直观和容易理解,因为它仅仅涉及到了字符在字母表上的平移操作,不需要复杂的数学背景就能掌握。

  2. 快速执行:算法执行速度快,因为它对每个字符进行的是单一操作,无需复杂的循环或递归结构,时间复杂度为O(n)。

  3. 易于实现:在任何编程语言中都可以轻松实现凯撒加密算法,适合初学者学习密码学的基础知识。

B.缺点:

  1. 安全性低:凯撒加密算法的安全性极低,容易被破解。攻击者可以通过频率分析、尝试所有可能的偏移量等方式迅速恢复原文,尤其是对于英文这样的语言,由于字母出现频率的规律性,使得凯撒密码很容易被破解。

  2. 固定偏移量:加密过程中使用的偏移量一旦被确定,便会对所有的消息使用同一密钥,这意味着同一个密钥加密的所有消息均面临相同的破解风险。

  3. 缺乏灵活性:由于只能进行固定位数的偏移,无法满足更复杂的安全需求,也无法应对不同用户或不同消息使用不同密钥的需求。

  4. 抗攻击能力弱:对于现代密码学的标准,凯撒加密几乎不具备抵抗任何形式的密码分析攻击的能力,不论是穷举攻击、统计分析攻击还是已知明文攻击。

因此,凯撒加密主要用于教学目的,展现加密的基本思想,但在实际信息安全领域中早已被淘汰,不再作为保障信息安全的有效手段。

  • 21
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JJJ69

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值