目录
前言
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_encrypt
和 caesar_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.优点:
-
简单易懂:凯撒加密算法非常直观和容易理解,因为它仅仅涉及到了字符在字母表上的平移操作,不需要复杂的数学背景就能掌握。
-
快速执行:算法执行速度快,因为它对每个字符进行的是单一操作,无需复杂的循环或递归结构,时间复杂度为O(n)。
-
易于实现:在任何编程语言中都可以轻松实现凯撒加密算法,适合初学者学习密码学的基础知识。
B.缺点:
-
安全性低:凯撒加密算法的安全性极低,容易被破解。攻击者可以通过频率分析、尝试所有可能的偏移量等方式迅速恢复原文,尤其是对于英文这样的语言,由于字母出现频率的规律性,使得凯撒密码很容易被破解。
-
固定偏移量:加密过程中使用的偏移量一旦被确定,便会对所有的消息使用同一密钥,这意味着同一个密钥加密的所有消息均面临相同的破解风险。
-
缺乏灵活性:由于只能进行固定位数的偏移,无法满足更复杂的安全需求,也无法应对不同用户或不同消息使用不同密钥的需求。
-
抗攻击能力弱:对于现代密码学的标准,凯撒加密几乎不具备抵抗任何形式的密码分析攻击的能力,不论是穷举攻击、统计分析攻击还是已知明文攻击。
因此,凯撒加密主要用于教学目的,展现加密的基本思想,但在实际信息安全领域中早已被淘汰,不再作为保障信息安全的有效手段。