有人能给出这个柱形密码的反/解密算法吗密钥长度可能会有所不同,但这里给出的加密值是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;
}

内部循环现在有一个键skipskip + 1,这取决于字符串的区域。(上面草图的)最后一列在单独的循环中处理,因为它看起来更整洁。

08-06 05:09