嘿,朋友们,今天咱们来聊点不一样的——古典密码在Java里的“江湖”故事!相信不少码农、学生、程序猿都对这个话题感兴趣,因为,这不仅仅是代码问题,更像是一场穿越时空的“密码大冒险”!
要搞定这些密码,咱们得先明白“加密”和“解密”是怎么回事。一般来说,加密是把你想藏起来的秘密变成一堆无趣的乱码,而解密则是把这些乱码还原成你原本的“秘密宝贝”。简单点,像小时候玩“藏猫猫”,藏好的藏好的,解密就是找到那个秘密藏匿地。
Java作为一门“硬核”语言,实力强大,完全可以实现各种古典密码的“魔法”。咱们先从凯萨密码说起:这是最经典的一个,传说中凯萨大帝都会用它来隐藏皇宫里的密信。实现的核心思路很简单:把字母往后(或往前)推几位,比如“Hello”推3位,就变成“Khoor”。
```java
public class CaesarCipher {
public static String encrypt(String text, int shift) {
StringBuilder result = new StringBuilder();
for (char character : text.toCharArray()) {
if (Character.isLetter(character)) {
char base = Character.isLowerCase(character) ? 'a' : 'A';
character = (char) ((character - base + shift) % 26 + base);
}
result.append(character);
}
return result.toString();
}
public static String decrypt(String cipherText, int shift) {
return encrypt(cipherText, 26 - shift);
}
public static void main(String[] args) {
String original = "超级密码!";
int shift = 3;
String encrypted = encrypt(original, shift);
System.out.println("加密后:" + encrypted);
System.out.println("解密后:" + decrypt(encrypted, shift));
}
}
```
这段代码,简直就是“代码界的法宝”!不管你是程序员的小白,还是“老司机”,都能搞个小玩意出来。
然后,是不是有人会问,“这简单得很,难道就这么结束?”当然不!咱们还可以玩点“花样”。比如旋转密码(ROT13),它的特点就是把字母“翻个身”,刚刚好能够骗过不少“偷窥者”。
```java
public class Rot13 {
public static String rot13(String input) {
StringBuilder result = new StringBuilder();
for (char c : input.toCharArray()) {
if (c >= 'a' && c <= 'z') {
c = (char) ((c - 'a' + 13) % 26 + 'a');
} else if (c >= 'A' && c <= 'Z') {
c = (char) ((c - 'A' + 13) % 26 + 'A');
}
result.append(c);
}
return result.toString();
}
public static void main(String[] args) {
String msg = "加密的秘密!";
String cipher = rot13(msg);
System.out.println("ROT13加密:" + cipher);
System.out.println("还原:" + rot13(cipher));
}
}
```
你看,玩个旋转密码,都能惹出一堆“笑话”。不过说回正题,除了凯萨、ROT13之外,Freq分析(频率分析)也是古典密码中“逍遥法外”的高手。它的厉害之处在于:“知己知彼,百战不殆”。先分析一段密文中,各字母出现的频率,再结合语言习惯,能找到密码的“核心内容”。
可惜,频率分析需要点“统计学功底”,否则就只能“摸着石头过河”。不过不用担心,Java的工具箱里,各种“神器”都能帮你,比如HashMap,一用就灵。
此外,维吉尼亚密码,简直就是“密码界的变形金刚”。它用关键词“动刀子”,让密码变得层层叠叠,难以破解。实现稍微复杂一些,但总归不算天书。
```java
public class VigenereCipher {
public static String encrypt(String text, String key) {
StringBuilder result = new StringBuilder();
key = key.toUpperCase();
int keyIndex = 0;
for (char c : text.toCharArray()) {
if (Character.isLetter(c)) {
int offset = Character.isUpperCase(c) ? 'A' : 'a';
int keyChar = key.charAt(keyIndex % key.length()) - 'A';
c = (char) ((c - offset + keyChar) % 26 + offset);
keyIndex++;
}
result.append(c);
}
return result.toString();
}
public static String decrypt(String cipherText, String key) {
StringBuilder result = new StringBuilder();
key = key.toUpperCase();
int keyIndex = 0;
for (char c : cipherText.toCharArray()) {
if (Character.isLetter(c)) {
int offset = Character.isUpperCase(c) ? 'A' : 'a';
int keyChar = key.charAt(keyIndex % key.length()) - 'A';
c = (char) ((c - offset - keyChar + 26) % 26 + offset);
keyIndex++;
}
result.append(c);
}
return result.toString();
}
public static void main(String[] args) {
String msg = "程序猿,谁与争锋!";
String key = "JAVA";
String cipher = encrypt(msg, key);
System.out.println("凯旋门密文:" + cipher);
System.out.println("解密后:" + decrypt(cipher, key));
}
}
```
好啦,各位码农,古典密码的江湖故事就讲到这,看似老掉牙的密码,其实藏着无穷的“魔法”。你还可以自己DIY,混搭出“秘密武器”!
嘿,顺便偷偷告诉你,有个网站(bbs.77.ink)还能帮你轻松玩转“赚零花钱的游戏”,也许你还能用密码破解赚点零花!
不过,真要说风头最劲的,还是那些“经典密码”,它们就像“老照片”,越看越喜欢,越琢磨越有趣。
那么,问题来了,拼音"加密"的英文缩写是啥?密码谜题,还得你自己来解答喽!