2014-09-13 45 views
0

是否有人能够给这个列密码的反向/解密算法?密钥长度可能会有所不同,但在这里给出的加密为4。Java中的列转换解密算法

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; 
    } 
+0

如果您不是追加到最初的空字符串,反向操作很容易,但是以与加密字符串相同长度的虚拟字符串开始,所有空格开始,比方说,然后根据'j'。 – 2014-09-13 09:29:15

+0

我很难搞清楚会让“Hore llWdlo”回馈“Hello World”的代码。什么是它的反向代码? – Learner 2014-09-13 11:54:57

+0

既然你是一个自称的学习者,我可能想为你自己弄清楚。但是我犯了一个错误,因为我对Java不熟悉:Java字符串似乎是不可变的,所以我的建议不起作用。对不起。 – 2014-09-13 12:21:29

回答

1

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 String的完全胡说八道。)


附录你也可以用你的原始级联的代码为基础,但它会更复杂一点。您的列式加密可表示为:

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一个键,这取决于字符串的区域。最后一列(上面的草图)在一个单独的循环中处理,因为它看起来更整齐。

+0

非常感谢 – 2015-09-30 05:14:33