有人能给出这个柱形密码的反/解密算法吗密钥长度可能会有所不同,但这里给出的加密值是4。
String input = "Hello World"
String output = "Hore llWdlo"
int key =4;
public static String encrypt(int key, String plainT) {
String outString= "";
for (int j = 0; j < key; j++) {
for (int i = j; i < plainT.length(); i += key) {
outString+= plainT.charAt(i);
}
}
return outString;
}
最佳答案
Java字符串是不可变的,因此不能对其数据进行操作。但是,如果可以重写编码函数以使用字符数组:
public static String encrypt(int key, String plainT)
{
char[] res = new char[plainT.length()];
int k = 0;
for (int j = 0; j < key; j++) {
for (int i = j; i < plainT.length(); i += key) {
res[k++] = plainT.charAt(i);
}
}
return String.copyValueOf(res);
}
然后您可以轻松地还原该过程:
public static String decrypt(int key, String encT)
{
char[] res = new char[encT.length()];
int k = 0;
for (int j = 0; j < key; j++) {
for (int i = j; i < encT.length(); i += key) {
res[i] = encT.charAt(k++);
}
}
return String.copyValueOf(res);
}
在这里实现了一个辅助的
char
数组和一个附加索引k
。还原过程与还原索引相同(这意味着未按顺序填充解密数组,就像未按顺序读取原始字符串一样。)(注意:我不熟悉Java,所以我希望更改char数组并将其转换为字符串能像我所期望的那样工作,而且我没有对Java字符串说任何直截了当的废话。)
补遗您也可以使用您的原始连接代码作为基础,但它会有点复杂。您的按列加密可以表示为:
H o r
e _ l
l W d
l o
加密的字符串水平读取,解密的原始字符串垂直读取如果您的字符串是
"Hello World!"
,带有一个excamation标记,那么您将拥有一个长度为12的字符串,并且您可以使用带有还原键12 / 4 == 3
的原始代码。但实际上我们有一个可变的键:3代表第一行,2代表最后一行。
public static String decrypt(int key, String str)
{
String out = "";
int skip = str.length() / key;
int rest = str.length() % key * (skip + 1);
for (int j = 0; j < skip; j++) {
int i = j;
while (i < str.length()) {
out += str.charAt(i);
i += skip;
if (i < rest) i++;
}
}
for (int i = skip; i < rest; i += skip + 1) {
out += str.charAt(i);
}
return out;
}
内部循环现在有一个键
skip
或skip + 1
,这取决于字符串的区域。(上面草图的)最后一列在单独的循环中处理,因为它看起来更整洁。