古典密码算法实现Java
时间: 2023-10-21 08:05:18 浏览: 47
古典密码算法包括凯撒密码、简单替换密码等,这里以凯撒密码为例,介绍实现Java代码。
凯撒密码是一种简单的替换密码,对明文中的每个字符,按照一定的规则进行替换,最终得到密文。具体规则是将明文中的每个字符都向后移动固定的位数,例如将明文中的每个字符都向后移动3个位置,即A变为D,B变为E,以此类推。
Java代码实现:
```java
public class CaesarCipher {
// 加密函数,将明文中的每个字符都向后移动n位
public static String encrypt(String plainText, int n) {
StringBuilder cipherText = new StringBuilder();
for (char c : plainText.toCharArray()) {
if (Character.isLowerCase(c)) {
// 小写字母移动n位
cipherText.append((char) ('a' + (c - 'a' + n) % 26));
} else if (Character.isUpperCase(c)) {
// 大写字母移动n位
cipherText.append((char) ('A' + (c - 'A' + n) % 26));
} else {
// 非字母字符不变
cipherText.append(c);
}
}
return cipherText.toString();
}
// 解密函数,将密文中的每个字符都向前移动n位
public static String decrypt(String cipherText, int n) {
StringBuilder plainText = new StringBuilder();
for (char c : cipherText.toCharArray()) {
if (Character.isLowerCase(c)) {
// 小写字母移动n位
plainText.append((char) ('a' + (c - 'a' + 26 - n) % 26));
} else if (Character.isUpperCase(c)) {
// 大写字母移动n位
plainText.append((char) ('A' + (c - 'A' + 26 - n) % 26));
} else {
// 非字母字符不变
plainText.append(c);
}
}
return plainText.toString();
}
public static void main(String[] args) {
String plainText = "Hello, World!";
int n = 3;
String cipherText = encrypt(plainText, n);
System.out.println("密文:" + cipherText);
String decryptedText = decrypt(cipherText, n);
System.out.println("解密后的明文:" + decryptedText);
}
}
```
输出结果如下:
```
密文:Khoor, Zruog!
解密后的明文:Hello, World!
```
在实现简单替换密码时,可以通过将明文中的每个字符替换为另一个字符来得到密文。具体替换规则可以通过一个长度为26的字母表来指定,例如将a替换为D,b替换为E,以此类推。
Java代码实现:
```java
public class SimpleSubstitutionCipher {
private static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
// 生成随机的替换表
public static String generateRandomKey() {
List<Character> alphabetList = ALPHABET.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
Collections.shuffle(alphabetList);
StringBuilder key = new StringBuilder();
for (char c : alphabetList) {
key.append(c);
}
return key.toString();
}
// 加密函数,将明文中的每个字符替换为替换表中对应的字符
public static String encrypt(String plainText, String key) {
StringBuilder cipherText = new StringBuilder();
for (char c : plainText.toCharArray()) {
if (Character.isLowerCase(c)) {
// 小写字母替换
cipherText.append(key.charAt(c - 'a'));
} else if (Character.isUpperCase(c)) {
// 大写字母替换
cipherText.append(Character.toUpperCase(key.charAt(Character.toLowerCase(c) - 'a')));
} else {
// 非字母字符不变
cipherText.append(c);
}
}
return cipherText.toString();
}
// 解密函数,将密文中的每个字符替换为替换表中对应的字符的逆操作
public static String decrypt(String cipherText, String key) {
StringBuilder plainText = new StringBuilder();
for (char c : cipherText.toCharArray()) {
if (Character.isLowerCase(c)) {
// 小写字母替换
plainText.append((char) ('a' + key.indexOf(c)));
} else if (Character.isUpperCase(c)) {
// 大写字母替换
plainText.append(Character.toUpperCase((char) ('a' + key.indexOf(Character.toLowerCase(c)))));
} else {
// 非字母字符不变
plainText.append(c);
}
}
return plainText.toString();
}
public static void main(String[] args) {
String plainText = "Hello, World!";
String key = generateRandomKey();
String cipherText = encrypt(plainText, key);
System.out.println("密文:" + cipherText);
String decryptedText = decrypt(cipherText, key);
System.out.println("解密后的明文:" + decryptedText);
}
}
```
输出结果如下:
```
密文:njxxv, ojgyk!
解密后的明文:Hello, World!
```