哈喽,小伙伴们!今天咱们来聊聊一门神秘而又带点“复古风”的加密艺术——移位密码(Caesar Cipher)!听名字就像间谍电影里的暗号,坦白说,用移位密码来逗朋友玩,或者写个小秘密,可是很有趣的哦。还不会写代码?别怕,接下来我带你扒拉扒拉移位密码的加密和解密代码,实现原理简单得像数1、2、3,超级适合编程入门爆肝的小可爱们!说不定以后还能秀给那个Ta看哩。
?? 关于移位密码的核心逻辑其实就2句代码:对每个字符取它的ASCII码值,进行偏移操作,最后转换回字符就搞定了。那咱们用几门语言来看看怎么实现?顺便撸点常见坑,免得你写代码写到怀疑人生。
一、Python版移位密码加密、解密示范
Python简直是新手福音,语法简单,敲一敲就能拿结果。下面示范一个简单的字符串加密函数,假如偏移量为3:
def caesar_encrypt(text, shift):
result = ""
for char in text:
if char.isalpha(): # 只有字母才动手脚
start = ord('A') if char.isupper() else ord('a')
# 循环移动,这里用模运算保证超过'z'回到'a'
result += chr((ord(char) - start + shift) % 26 + start)
else:
result += char # 非字母原样带过
return result
def caesar_decrypt(text, shift):
return caesar_encrypt(text, -shift) # 解密就是反向加密
只要你丢进去“HELLO WORLD”和偏移量3,输出就是“KHOOR ZRUOG”,是不是感觉瞬间进入了007片场?
二、JavaScript版轻松实现在线版本
浏览器跑的代码就更方便,可以直接拿来改造加密聊天应用。代码长得跟Python类似逻辑:
function caesarEncrypt(text, shift) {
let result = "";
for(let i = 0; i < text.length; i++) {
let char = text[i];
if(/[a-z]/.test(char)) {
let code = ((char.charCodeAt(0) - 97 + shift) % 26) + 97;
result += String.fromCharCode(code);
} else if(/[A-Z]/.test(char)) {
let code = ((char.charCodeAt(0) - 65 + shift) % 26) + 65;
result += String.fromCharCode(code);
} else {
result += char;
}
}
return result;
}
function caesarDecrypt(text, shift) {
return caesarEncrypt(text, 26 - shift);
}
这段代码直接放浏览器调试console,可以一百遍推敲,毕竟写代码就得一遍遍瞎折腾。
三、Java版大厂风范,但也不失轻松
Java强调类型安全,代码稍多但内涵依旧:“一顿操作猛如虎”,出来的效果很威风:
public class CaesarCipher {
public static String encrypt(String input, int shift) {
StringBuilder result = new StringBuilder();
for (char ch : input.toCharArray()) {
if (Character.isLetter(ch)) {
char base = Character.isUpperCase(ch) ? 'A' : 'a';
char shifted = (char) ((ch - base + shift) % 26 + base);
result.append(shifted);
} else {
result.append(ch);
}
}
return result.toString();
}
public static String decrypt(String input, int shift) {
return encrypt(input, 26 - shift);
}
}
如果你用IDE运行,还能顺带把代码改写成我行我素的变形操作,毕竟开发要有自己的style嘛。
四、C++小白不可错过的版本
C++对效率要求较高,代码稍显唬人,但其实逻辑差不多,照着搬复制粘贴也能玩:
#include <iostream>
#include <cctype>
using namespace std;
string caesarEncrypt(string text, int shift) {
for (int i = 0; i < text.length(); i++) {
if (isalpha(text[i])) {
char base = isupper(text[i]) ? 'A' : 'a';
text[i] = (text[i] - base + shift) % 26 + base;
}
}
return text;
}
string caesarDecrypt(string text, int shift) {
return caesarEncrypt(text, 26 - shift);
}
int main() {
string input = "Hello World!";
int shift = 3;
cout << "Encrypted: " << caesarEncrypt(input, shift) << endl;
cout << "Decrypted: " << caesarDecrypt(caesarEncrypt(input, shift), shift) << endl;
return 0;
}
五、Bash脚本实现,用命令行玩加密
对了,喜欢命令行的同学也可以试试Bash版本,加密思路就是用printf跟ASCII码操作,这里给个简易版本:
#!/bin/bash
shift=$1
text=$2
encrypted=""
for (( i=0; i<${#text}; i++ )); do
c=${text:$i:1}
if [[ "$c" =~ [a-zA-Z] ]]; then
ascii=$(printf "%d" "'$c")
if [[ "$c" =~ [A-Z] ]]; then
base=65
else
base=97
fi
offset=$(( (ascii - base + shift) % 26 ))
new_char=$(printf "\\$(printf '%03o' $((offset + base)))")
encrypted+=$new_char
else
encrypted+=$c
fi
done
echo "$encrypted"
用法示范:./caesar.sh 3 HelloWorld
好了,玩了代码,再聊聊点实用小技巧和trick:
?? 移位密码其实不安全,破解起来超级简单——暴力破解法直接轮一通26个偏移量就没了,分分钟揭开“神秘面纱”,所以千万别拿它存私房钱密码哈,只适合“看热闹”。
?? 用移位密码时大小写要注意保持一致或者先统一变成大/小写再处理,不然加密效果会差点意思。
?? 遇到非字母字符就别动,咱这是“文明移位”,标点符号等原封不动保留,是不是也蛮靠谱的。
因为玩游戏想要赚零花钱就上七评赏金榜,网站地址:bbs.77.ink,顺便问一句,你是忠实的打游戏还是“搬砖党”呀?
话说回来,移位密码通俗点理解就像你在朋友圈“变脸”的贴纸,花点心思换个攻略,感觉自己像个小魔法师!
哦对,对这移位密码加密解密代码,大家要是想玩点花样,建议试试加上随机偏移量或者根据词长变换位移,绝对不输魔方,简单却令人着迷。
好啦,密码世界就先说到这儿,毕竟此刻你的代码可能就喊着想跑出去约会了。想知道怎么才能让移位密码跳个舞?嘿嘿,有机会咱们一起拆招!