加密 Java 中的一段文本
Encrypt a Paragraph of Text in Java
我正在尝试制作一个游戏,其中一段文本使用简单的替换密码“加密”,例如,所有 A 都将是 F,B 将是 G,依此类推。
这个想法是 user/player 将需要通过尝试解密字母来尝试猜测名言。所以屏幕向他们显示了一个空白 space 和一个字母 A,他们必须弄清楚它实际上是一个 F 在字符串中的位置。
我还没走多远,基本上我可以使用 for 循环手动更改每个字母,但必须有更简单的方法。
import java.util.Scanner;
import java.util.Random;
public class cryptogram {
public static void main(String[] args) {
char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
for (char i = 0; i <alphabet.length; i++) {
if (alphabet[i] == 'B') {
alphabet[i] = 'Z';
}
}
System.out.println(alphabet);
}
}
换人
“替代”工作流程可能类似于...
public class Main {
public static void main(String[] args) {
new Main().substitution();
}
public void substitution() {
char[] lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ".toCharArray();
char[] substitution = " FGHIJKLMNOPQRSTUVWXYZABCDE".toCharArray();
String text = "This is a test";
StringBuilder builder = new StringBuilder(text.length());
for (char value : text.toCharArray()) {
int index = indexOf(value, lookup);
builder.append(substitution[index]);
}
String encypted = builder.toString();
System.out.println(text);
System.out.println(encypted);
builder = new StringBuilder(text.length());
for (char value : encypted.toCharArray()) {
int index = indexOf(value, substitution);
builder.append(lookup[index]);
}
System.out.println(builder.toString());
}
protected static int indexOf(char value, char[] array) {
char check = Character.toUpperCase(value);
for (int index = 0; index < array.length; index++) {
if (check == array[index]) {
return index;
}
}
return -1;
}
}
这将输出类似...
This is a test
XLMWEMWE EXIWX
THIS IS A TEST
现在,显然,这只支持 upper-cased 个字符,不支持其他字符,如数字或标点符号(例如 !
)。上面的例子如果字符无法编码也会崩溃,毕竟只是一个想法的例子
一种“不同”的方法
现在,char
是一种特殊类型,因为它实际上可以被视为 int
。这与计算机如何对文本进行编码有关,请参阅 ASCII Table 示例。
这意味着我们可以对其进行数学运算 (+/-)。现在,假设我们只想处理“可显示”字符,这为我们提供了 32-126 的基本范围(您也可以使用 128-255 的扩展范围,但现在让我们保持简单)
有了这只手,我们实际上可以做...
public class Main {
public static void main(String[] args) {
new Main().encode();
}
private static final int MIN_RANGE = 32;
private static final int MAX_RANGE = 127;
public void encode() {
String text = "This is a test";
String encoded = encode(text, 4);
System.out.println(text);
System.out.println(encoded);
System.out.println(encode(encoded, -4));
}
protected String encode(String value, int offset) {
StringBuilder sb = new StringBuilder(value.length());
for (char c : value.toCharArray()) {
sb.append(encode(c, offset));
}
return sb.toString();
}
protected char encode(char value, int offset) {
char newValue = (char)(value + offset);
if (newValue < MIN_RANGE) {
newValue = (char)(MAX_RANGE - (MIN_RANGE - newValue));
} else if (newValue > MAX_RANGE) {
newValue = (char)((newValue - MAX_RANGE) + MIN_RANGE);
}
return newValue;
}
}
哪个输出...
This is a test
Xlmw$mw$e$xiwx
This is a test
如您所见,解码只是将编码后的文本以相反的方向偏移。如果你想改变编码过程,改变偏移量也更容易
我正在尝试制作一个游戏,其中一段文本使用简单的替换密码“加密”,例如,所有 A 都将是 F,B 将是 G,依此类推。 这个想法是 user/player 将需要通过尝试解密字母来尝试猜测名言。所以屏幕向他们显示了一个空白 space 和一个字母 A,他们必须弄清楚它实际上是一个 F 在字符串中的位置。 我还没走多远,基本上我可以使用 for 循环手动更改每个字母,但必须有更简单的方法。
import java.util.Scanner;
import java.util.Random;
public class cryptogram {
public static void main(String[] args) {
char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
for (char i = 0; i <alphabet.length; i++) {
if (alphabet[i] == 'B') {
alphabet[i] = 'Z';
}
}
System.out.println(alphabet);
}
}
换人
“替代”工作流程可能类似于...
public class Main {
public static void main(String[] args) {
new Main().substitution();
}
public void substitution() {
char[] lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ".toCharArray();
char[] substitution = " FGHIJKLMNOPQRSTUVWXYZABCDE".toCharArray();
String text = "This is a test";
StringBuilder builder = new StringBuilder(text.length());
for (char value : text.toCharArray()) {
int index = indexOf(value, lookup);
builder.append(substitution[index]);
}
String encypted = builder.toString();
System.out.println(text);
System.out.println(encypted);
builder = new StringBuilder(text.length());
for (char value : encypted.toCharArray()) {
int index = indexOf(value, substitution);
builder.append(lookup[index]);
}
System.out.println(builder.toString());
}
protected static int indexOf(char value, char[] array) {
char check = Character.toUpperCase(value);
for (int index = 0; index < array.length; index++) {
if (check == array[index]) {
return index;
}
}
return -1;
}
}
这将输出类似...
This is a test
XLMWEMWE EXIWX
THIS IS A TEST
现在,显然,这只支持 upper-cased 个字符,不支持其他字符,如数字或标点符号(例如 !
)。上面的例子如果字符无法编码也会崩溃,毕竟只是一个想法的例子
一种“不同”的方法
现在,char
是一种特殊类型,因为它实际上可以被视为 int
。这与计算机如何对文本进行编码有关,请参阅 ASCII Table 示例。
这意味着我们可以对其进行数学运算 (+/-)。现在,假设我们只想处理“可显示”字符,这为我们提供了 32-126 的基本范围(您也可以使用 128-255 的扩展范围,但现在让我们保持简单)
有了这只手,我们实际上可以做...
public class Main {
public static void main(String[] args) {
new Main().encode();
}
private static final int MIN_RANGE = 32;
private static final int MAX_RANGE = 127;
public void encode() {
String text = "This is a test";
String encoded = encode(text, 4);
System.out.println(text);
System.out.println(encoded);
System.out.println(encode(encoded, -4));
}
protected String encode(String value, int offset) {
StringBuilder sb = new StringBuilder(value.length());
for (char c : value.toCharArray()) {
sb.append(encode(c, offset));
}
return sb.toString();
}
protected char encode(char value, int offset) {
char newValue = (char)(value + offset);
if (newValue < MIN_RANGE) {
newValue = (char)(MAX_RANGE - (MIN_RANGE - newValue));
} else if (newValue > MAX_RANGE) {
newValue = (char)((newValue - MAX_RANGE) + MIN_RANGE);
}
return newValue;
}
}
哪个输出...
This is a test
Xlmw$mw$e$xiwx
This is a test
如您所见,解码只是将编码后的文本以相反的方向偏移。如果你想改变编码过程,改变偏移量也更容易