Java 实现单字母密码
在这个问题中,我们需要使用单字母密码技术将文本转换为密码文本。
在单字母密码算法中,所有字母字符都被预先映射到它们的密码字符上。因此,我们需要用映射的字符替换所有纯文本字符。
下面是包含字符映射的表格。
a\mathrm{\rightarrow;}Q
b \mathrm{\rightarrow;} W
c\mathrm{\rightarrow;}E
d\mathrm{\rightarrow;}R
e\mathrm{\rightarrow;}T
f\mathrm{\rightarrow;}Y
g \mathrm{\rightarrow;}U
h\mathrm{\rightarrow;}I
i\mathrm{\rightarrow;}O
j\mathrm{\rightarrow;}P
k\mathrm{\rightarrow;}A
l\mathrm{\rightarrow;}S
m\mathrm{\rightarrow;}D
n\mathrm{\rightarrow;}F
o\mathrm{\rightarrow;}G
p\mathrm{\rightarrow;}H
q\mathrm{\rightarrow;}J
r\mathrm{\rightarrow;}K
s\mathrm{\rightarrow;}L
t\mathrm{\rightarrow;}Z
u\mathrm{\rightarrow;}X
v\mathrm{\rightarrow;}C
w\mathrm{\rightarrow;}V
x\mathrm{\rightarrow;}B
y\mathrm{\rightarrow;}N
z\mathrm{\rightarrow;}M
在上面的映射中,我们可以看到字母字符映射到键盘上的字符序列。
注意 - 除了字母字符外,我们需要保留所有其他字符。
问题描述 - 我们以字符串格式给出了纯文本。我们需要使用单字母密码技术将其转换为密码文本。
示例
输入
str = 'This is a normal string!'
输出
'ZIOL OL Q FGKDQS LZKOFU!'
解释 - 根据映射表,所有字符都映射到一个特定的字符。
输入
str = 'ab'
输出
'QW'
说明 - 这里,a -> Q,b -> W。密文是’QW’。
输入
str = "How are you?"
输出
IGV QKT NGX?
解释 - 我们将字符映射加密。
方法1
在这个方法中,我们可以使用映射或数组数据结构来存储每个字符的映射关系。然后,我们遍历明文的每个字符,并用映射的字符替换它。
算法
步骤1 - 定义包含所有字母字符顺序的“alphabeticalChars”数组。
步骤2 - 定义“mappingChar”来存储与字母相关的映射字符。
步骤3 - 定义encryptStr()函数来加密明文。
步骤3.1 - 在encryptStr()函数中,用一个空字符串初始化’e_srt’以存储加密字符串。
步骤3.2 - 使用循环遍历字符串。同时,使用嵌套循环在’alphabeticalChars[]’数组中找到当前字符的索引。
步骤3.3 - 如果在数组中找到字符的索引,从找到的索引中获取映射字符,并将其附加到e_str字符串上。
步骤3.4 - 如果字符不是小写字母,则将其原样附加到e_Str字符串上。
步骤3.5 - 返回e_str字符串。
步骤4 - 定义decryptStr()函数来解密加密字符串。
步骤4.1 - 在decryptStr()函数中,用一个字符串’d_str’来存储明文。
步骤4.2 - 开始遍历密文。同时,使用嵌套循环遍历’mappingChars’数组并找到当前字符的索引。
步骤4.3 - 如果字符是字母,根据找到的索引从alphabeticalChars数组中获取明文字符,并将其附加到d_str字符串上。如果字符是特殊字符,则原样附加。
步骤4.4 - 返回d_str字符串。
代码
import java.io.*;
public class Main {
// array of alphabets
public static char alphabeticalChars[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
// array of mapped alphabets
public static char mappingChars[] = { 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M' };
// Encrypting the string
public static String encryptStr(String str) {
String e_str = "";
// traverse the string
for (int p = 0; p < str.length(); p++) {
for (int q = 0; q < 26; q++) {
// match the alphabets of the string with the array's alphabets
if (str.charAt(p) == alphabeticalChars[q]) {
e_str += mappingChars[q];
break;
}
// If the character is a special character, add it as it is
if (str.charAt(p) < 'a' || str.charAt(p) > 'z') {
e_str += str.charAt(p);
break;
}
}
}
return e_str;
}
public static String decryptStr(String str) {
String d_str = "";
// traverse the string
for (int p = 0; p < str.length(); p++) {
for (int q = 0; q < 26; q++) {
// match characters
if (str.charAt(p) == mappingChars[q]) {
d_str += alphabeticalChars[q];
break;
}
// For special characters
if (str.charAt(p) < 'A' || str.charAt(p) > 'Z') {
d_str += str.charAt(p);
break;
}
}
}
return d_str;
}
public static void main(String args[]) {
String str = "This is a normal string!";
System.out.println("Normal text is : " + str);
System.out.println(" ");
// Encryption part
String e_str = encryptStr(str.toLowerCase());
System.out.println("Encrypted string is : " + e_str);
// decryption part
System.out.println("Decrypted string is : " + decryptStr(e_str));
}
}
输出
Normal text is : This is a normal string!
Encrypted string is : ZIOL OL Q FGKDQS LZKOFU!
Decrypted string is : this is a normal string!
时间复杂度 - O(N),因为我们需要遍历明文进行加密和解密。
空间复杂度 - O(N),因为我们使用字符串来存储密文。
简单替换密码很容易实现,我们只需要将字母字符替换为映射字符。而且,它会保留数字和特殊字符。
简单替换密码提供了非常低级别的安全性,因为我们将每个明文字符替换为固定字符。所以,它保持了字符的频率不变。