java将输出拆分为4个字符的块和一个bruteForce方法
因此,我有一个为java任务编写的“Caesar密码”,但我缺少了两个必需的组件,这两个组件是我目前掌握的有限java知识所无法理解的
我需要通过将输出的字符串拆分为4个字符的块来进一步加密我的输出。 ie AFSD GRTH WRGD
我试着从标准库中查找java方法,但我还没有学习regex,而且我不能使用guava,因为我通过电子邮件提交了这篇文章。 这门课也还没有讲过
我还需要包括一个bruteForce方法,该方法加密我的明文,但为每个可能的密钥(0-25)输出密文。 我尝试过使用while循环,它将shiftKey设置为0,并在循环结束时将key增加1,但输出的结果非常混乱
public String bruteForce(String plainText) {
plainText = plainText.replaceAll("[^A-Za-z0-9]", "");
String cipherText = "";
int shiftKey = 0;
while (shiftKey <= 26) {
for (int i = 0; i < plainText.length(); i++) {
int charPosition = alphabet.indexOf(plainText.charAt(i));
int keyVal = (shiftKey + charPosition) % 26;
char replaceVal = this.alphabet.charAt(keyVal);
cipherText += replaceVal;
shiftKey++;
}
}
return cipherText.toUpperCase();
}
这是我到目前为止的代码
class CaesarCipher {
private final String alphabet = "abcdefghijklmnopqrstuvwxyz";
private final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public String bruteForce(String plainText, int shiftKey) {
plainText = plainText.replaceAll("[^A-Za-z0-9]", "");
String cipherText = "";
for (int i = 0; i < plainText.length(); i++) {
int charPosition = alphabet.indexOf(plainText.charAt(i));
int keyVal = (shiftKey + charPosition) % 26;
char replaceVal = this.alphabet.charAt(keyVal);
cipherText += replaceVal;
}
return cipherText.toUpperCase();
}
public String encrypt(String plainText, int shiftKey) {
plainText = plainText.replaceAll("[^A-Za-z0-9]", "");
String cipherText = "";
for (int i = 0; i < plainText.length(); i++) {
int charPosition = alphabet.indexOf(plainText.charAt(i));
int keyVal = (shiftKey + charPosition) % 26;
char replaceVal = this.alphabet.charAt(keyVal);
cipherText += replaceVal;
}
return cipherText.toUpperCase();
}
public String decrypt(String cipherText, int shiftKey) {
String plainText = "";
for (int i = 0; i < cipherText.length(); i++) {
int charPosition = this.ALPHABET.indexOf(cipherText.charAt(i));
int keyVal = (charPosition - shiftKey) % 26;
if (keyVal < 0) {
keyVal = this.ALPHABET.length() + keyVal;
}
char replaceVal = this.ALPHABET.charAt(keyVal);
plainText += replaceVal;
}
return plainText.toUpperCase();
}
public static void main(String args[]) {
String plainText = "this; is s'ome te.xt with punct";
int shiftKey = 4;
CaesarCipher cc = new CaesarCipher();
String cipherText = cc.encrypt(plainText, shiftKey);
System.out.println("Plain Text :" + plainText);
System.out.println("Cipher Text :" + cipherText);
String PlainText = cc.decrypt(cipherText, shiftKey);
System.out.println("Plain Text :" + PlainText);
}
}
# 1 楼答案
四块
下面是我将字符串分成四块的方法:
这个方法取字符串,将其长度除以四,再加上一,以防它不能被四整除。它创建了一个字符串数组,其中每个元素将是一个由四个字母组成的块。然后,对于每个块,您获取输入的一个子串,开始索引计算为四的倍数,结束索引也计算为四的倍数。除非循环是在它的最终迭代中,在这种情况下,结束索引被计算为输入的长度。这样做是为了解释任何不能被四整除的输入
蛮力法
至于你的蛮力方法,你可能也想把输出作为一个数组,考虑到你的输出是26个不同的字符串,那么你只需要运行一个循环,使用你的另一个加密方法对输入进行加密,考虑到你正确地实现了这一点
顺便说一句,蛮力解密其实也很简单,只需将循环中的
encrypt(String)
方法更改为decrypt(String)
方法:打印阵列
下面是两个示例,使用蛮力方法,它们都将打印出26个不同的字符串:
我希望这有帮助