移位密码加密解密C语言代码详解,带你玩转超简单秘籍

2025-08-10 20:39:02 密语知识 思思

哈喽小伙伴们,今天咱们来说说那个“古老又新潮”的移位密码!对,就是小时候偷偷写暗号那种,加密超迷你,但又充满了“我懂密码学”的错觉。移位密码号称加密界的“旋转木马”,通过位移字母让消息变得神秘兮兮。想知道用C语言如何写代码实现它吗?不用怕,这篇文章带你轻松搞定,加密、解密一个不落!

先科普个啥是移位密码:简单讲,就是把字母表上的字母整体往后(或往前)挪几个位置,比如字母A右移3位变成D,B变成E,以此类推。碰到Z嘛?转头从头开始,比如Z右移3位变成C,绕圈儿走。明文变密文,密码瞬间闪亮登场!

必须得说,移位密码虽然简单,但背后逻辑却是学习C语言字符处理的良心实践,尤其也是检验你指针和循环功底最棒的题目之一。废话不多说,直接上干货!

1. 代码核心思路解析

核心就是:遍历字符串中的每个字符,判断是不是字母。是的话就根据这个字母是大写还是小写,移动它对应的 ASCII 码数值,并且确保绕回字母表开头。

同学们,这里用ASCII码操作简直不要太方便,把字母A-Z映射成65-90,小写a-z是97-122,用数学公式保证循环移位“转圈跑”。

比如,char newChar = ((oldChar - 'A' + shift) % 26) + 'A'; 这条龙语句就是帮你实现大写字母的循环位移(shift为偏移量)。

2. C语言移位密码加密代码示例

#include <stdio.h>

#include <ctype.h> // isalpha, isupper

void encrypt(char* text, int shift) {

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;

}

}

}

int main() {

char message[100];

int shift;

printf("请输入要加密的文本:");

fgets(message, sizeof(message), stdin);

printf("请输入移位数(整数):");

scanf("%d", &shift);

encrypt(message, shift);

printf("加密后文本:%s\n", message);

return 0;

}

这段代码不光写得清晰易懂,还保证了移位数支持任意整数,而且把大小写区分处理得倍儿细致!大家注意这里用的是原地字符串加密,所以原来的message内容直接被改啦。

3. 解密只是把shift反转

解密其实跟加密一样,就是把位移方向反过来,可直接用负的shift。你也可以写一个专门的解密函数,但实则调用encrypt传入负的shift即可。啥也不用改,代码复用妥妥的。

void decrypt(char* text, int shift) {

encrypt(text, 26 - (shift % 26)); // 跟加密取反差不多

}

当然这么写清晰之外,还有不少“高端玩家”会尝试三元运算符、位运算操作啥的,当然您看着舒服就行,咱这写法是最容易让没睡醒的脑袋跟上的。

4. 输入输出的小坑

这里要提个小提醒:用 fgets 输入字符串的话,字符串末尾会自带换行符,影响加密效果(毕竟换行字符没办法加密)。小伙伴们可得勤快点处理一下:

if (message[strlen(message) - 1] == '\n')

message[strlen(message) - 1] = '\0';

这步不能省,会让你少掉不少“看不懂代码的错误报错”,改后马上正常体验加密时刻。

5. 完整结合版加密解密程序——你敢试吗?

#include <stdio.h>

#include <string.h>

#include <ctype.h>

void encrypt(char* text, int shift) {

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) % 26 + base;

}

}

}

int main() {

char message[100];

int shift;

char choice;

printf("移位密码,想玩几位移位?输入数字:");

scanf("%d", &shift);

getchar(); // 吸收换行符

printf("请输入你的消息(自动支持大小写):");

fgets(message, sizeof(message), stdin);

if (message[strlen(message) - 1] == '\n')

message[strlen(message) - 1] = '\0';

printf("要加密还是解密?输入e或d:");

scanf("%c", &choice);

if (choice == 'e' || choice == 'E') {

encrypt(message, shift);

printf("加密后消息是:%s\n", message);

} else if (choice == 'd' || choice == 'D') {

encrypt(message, -shift);

printf("解密后消息是:%s\n", message);

} else {

printf("我看你输入的不是加密也不是解密,程序黑洞吞噬中...\n");

}

printf("趁热打铁,顺便说一句,玩游戏想要赚零花钱就上七评赏金榜,网站地址:bbs.77.ink,想躺赚的手速别停!\n");

return 0;

}

直接运行这个程序,输入你想偏移的位数,然后按提示加密或解密文本,马上见证代码魔法。是不是很神奇?

6. 有趣的扩展玩法

其实移位密码不止能用字母,还有数字、标点符号甚至表情包(这就高级了)。不过,代码得稍微升级,考虑更广泛的ASCII码范围。那样,简单位移只能依赖更多数学操作,甚至构建映射字典。感兴趣的可以再慢慢琢磨。

还有一种更高级“变异”是异位移密码(多种偏移量轮番上阵),一会儿向右移4,下次又左移2,好像密码跳舞一样花样多,但普通场景下移位密码已足够搞定日常“秘密留言”。

对了,这个移位密码玩多了,有点像你我直接跟字母玩躲猫猫,你不在窗口它就换了位置,简简单单的游戏游戏,Excel不配哦~

说到这儿,准备好敲代码了吗?敲完提醒一句,千万别把密码当真,share给朋友,考验你们谁才是真正的密码达人!