原理:
凯撒密码:它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。
注意:凯撒密码的偏移方向并无固定,可以是前移也可以是后移。在实际应用中,无论向左还是向右,只要偏移量是预先约定好的,并且加密与解密双方使用相同的规则,就可以正确地进行信息传递和还原。
解密
#include <stdio.h>
#include <string.h>
int main() {
char s[20], r[20];
int n;
printf("请输入密文(凯撒解密):");
fgets(s, sizeof(s), stdin);
s[strcspn(s, "\n")] = '\0'; // 移除可能的换行符
printf("请输入偏移量:");
scanf("%d", &n);
int len = strlen(s);
for (int i = 0; s[i] != '\0' && i < len; i++) {
if (s[i] >= 'A' && s[i] <= 'Z') {
r[i] = ((s[i] - 'A' - n + 26) % 26) + 'A'; // 对于大写字母,解密时应当减去偏移量
} else if (s[i] >= 'a' && s[i] <= 'z') {
r[i] = ((s[i] - 'a' - n + 26) % 26) + 'a'; // 对于小写字母,解密时同样减去偏移量
} else {
r[i] = s[i]; // 其他非字母字符原样复制
}
}
// 给解密结果字符串添加终止符
r[len] = '\0';
printf("解密后的明文为:");
for (int i = 0; r[i] != '\0'; i++) {
printf("%c", r[i]);
}
return 0;
}
示例:
密文:simplessn
偏移量:3 (因为是左移解密,实际上是-3)
明文:pfjmibppk
加密
加密与解密代码类似,只需将偏移量相同,修改偏移方向即可。