public class CaesarCipherDemo {/*** 加密方法* @param plaintext 明文* @param shift 移位数(1-25)* @return 密文*/public static String encrypt(String plaintext, int shift) {if (plaintext == null || plaintext.isEmpty()) {return "";}// 确保移位数在有效范围内shift = shift % 26;if (shift < 0) {shift += 26;}StringBuilder ciphertext = new StringBuilder();for (char c : plaintext.toCharArray()) {if (Character.isLetter(c)) {// 处理大写字母if (Character.isUpperCase(c)) {ciphertext.append((char) ('A' + (c - 'A' + shift) % 26));} // 处理小写字母else {ciphertext.append((char) ('a' + (c - 'a' + shift) % 26));}} else {// 非字母字符直接保留ciphertext.append(c);}}return ciphertext.toString();}/*** 解密方法* @param ciphertext 密文* @param shift 移位数(1-25)* @return 明文*/public static String decrypt(String ciphertext, int shift) {// 解密就是用负的移位数进行加密return encrypt(ciphertext, -shift);}public static void main(String[] args) {// 测试用例String[] testCases = {"Hello, World!","Secret Message 123","Java Programming","凯撒加密算法","ABCDEFGHIJKLMNOPQRSTUVWXYZ"};int shift = 3; // 经典的凯撒位移量System.out.println("凯撒加解密演示(位移量:" + shift + ")");System.out.println("================================");for (String original : testCases) {String encrypted = encrypt(original, shift);String decrypted = decrypt(encrypted, shift);System.out.println("\n原始文本: " + original);System.out.println("加密结果: " + encrypted);System.out.println("解密结果: " + decrypted);System.out.println("解密验证: " + (original.equals(decrypted) ? "成功" : "失败"));}// 验证不同位移量System.out.println("\n=== 不同位移量验证 ===");testDifferentShifts("Security Test", new int[]{1, 5, 13, 25, -3, 29});}/*** 测试不同位移量的效果*/public static void testDifferentShifts(String text, int[] shifts) {for (int shift : shifts) {String encrypted = encrypt(text, shift);String decrypted = decrypt(encrypted, shift);System.out.println("\n位移量: " + shift);System.out.println("加密结果: " + encrypted);System.out.println("解密结果: " + decrypted);}}
}
凯撒加解密演示(位移量:3)
================================原始文本: Hello, World!
加密结果: Khoor, Zruog!
解密结果: Hello, World!
解密验证: 成功原始文本: Secret Message 123
加密结果: Vhfuhw Phvvdjh 123
解密结果: Secret Message 123
解密验证: 成功原始文本: Java Programming
加密结果: Mdyd Surjudpplqj
解密结果: Java Programming
解密验证: 成功原始文本: 凯撒加密算法
加密结果: dqyahz
解密结果: anvxew
解密验证: 失败原始文本: ABCDEFGHIJKLMNOPQRSTUVWXYZ
加密结果: DEFGHIJKLMNOPQRSTUVWXYZABC
解密结果: ABCDEFGHIJKLMNOPQRSTUVWXYZ
解密验证: 成功=== 不同位移量验证 ===位移量: 1
加密结果: Tfdvsjuz Uftu
解密结果: Security Test位移量: 5
加密结果: Xjhzwnyd Yjxy
解密结果: Security Test位移量: 13
加密结果: Frphevgl Grfg
解密结果: Security Test位移量: 25
加密结果: Rdbtqhsx Sdrs
解密结果: Security Test位移量: -3
加密结果: Pbzrofqv Qbpq
解密结果: Security Test位移量: 29
加密结果: Vhfxulwb Whvw
解密结果: Security TestProcess finished with exit code 0
加密函数:encrypt方法实现了凯撒加密,支持以下特性:
处理大写和小写字母(保持原始大小写)
保留非字母字符(如数字、标点、空格等)
自动处理超出范围的移位值(如30等价于4)
解密函数:decrypt方法通过使用负位移量调用加密函数实现解密
主程序演示:
使用经典的3位移量进行标准测试
验证不同类型的输入(包含特殊字符、纯字母等)
测试多种位移量(包括负数和大于26的值)
扩展测试:testDifferentShifts方法展示了:
ROT13(移位13)的经典变体
边界情况(移位1和25)
负位移值
超过26的位移值
凯撒密码的特点:
属于单表替换密码
密钥空间只有26种可能(实际有效密钥为25个)
安全性较低,可通过暴力破 jie(枚举所有26种可能)
适合教学和简单场景,不适合安全敏感场景
该实现简单直观地展示了凯撒密码的基本原理和实现方式,可以直接运行查看加密解密效果。
对称加密特征:
加密和解密使用相同的密钥(或可通过简单推导得到的密钥)。
在凯撒算法中,加密使用移位数(如 shift=3),解密时使用负的移位数(如 shift=-3 或等效的 shift=23)。
密钥空间是同一个移位值,加密和解密逻辑共享该密钥。
非对称加密对比:
非对称加密需要公钥(公开加密)和私钥(保密解密),例如 RSA 算法。
凯撒算法没有公私钥的概念,因此不属于非对称加密。
代码验证:
加密方法:encrypt(plaintext, shift)
解密方法:decrypt(ciphertext, shift) → 本质是 encrypt(ciphertext, -shift)
加密和解密密钥(shift)是同一值的不同方向应用。
举个例子:
明文:HELLO
加密:shift=3 → 密文 KHOOR
解密:shift=-3(或 shift=23)→ 还原为 HELLO
总结:
凯撒算法是典型的对称加密技术,因其加解密过程依赖相同的密钥(移位数)。由于其密钥空间仅 25 种有效组合(移位 1-25),安全性较低,但适合作为加密算法的基础教学示例。