将像9这样的特定大小的字符串转换为另一个大小的字符串块,如4

时间:2014-11-02 19:55:17

标签: java encryption permutation

这是我的代码我试图创建一个置换密码。我遇到的问题是当plainText长度%密钥长度!= 0时,我得到一个错误,因为子字符串的结尾它超过了plainText长度,所以它超出了长度。我的测试通过了plainText =" abcdefg"键=#&34; 0213"创建" acbdegfh"的排列。但如果关键是例如" 021"我有一个错误,因为阻止不匹配他们变成" abc" " DEF" " G"但错误发生在" g"因为它达到了plainText的最终限制。关于如何解决这个问题的任何建议....

   private String key;
   private String plainText;
   private String encryptedText=""; 

   public void encrypt() {
        for (int i=0, k=key.length(); i<plainText.length(); i=i+key.length()){
            String temp=plainText.substring(i,k);
            arrangeLetters(temp);
            k=k+key.length();
        }
    }

    private void arrangeLetters(String temp) {
        for (int i=0; i<temp.length(); i++){

            char movement=key.charAt(i);
            int position=Character.getNumericValue(movement);
            encryptedText+=temp.charAt(position);   
        }

    }

2 个答案:

答案 0 :(得分:0)

关于加密方法的一些评论:

首先,可能会将String temp=plainText.substring(i,k)更改为String temp=plainText.substring(i,MIN(k,plainText.length()),因为没有约束k小于plainText,但是您创建的子字符串最多为第k个字符。

其次,我不认为你需要一个变量k,因为k总是i + key.length(),除非你点到了单词的末尾。如果用i + key.length()替换k,我认为它仍然有用......

答案 1 :(得分:0)

问题是如何在这种情况下定义以及如何继续进行。您有两种选择:

  1. 填充明文,使其成为密钥长度的倍数。应特别注意你想要的垫子。使用PKCS#7不是这种经典密码的选项。您可以使用一个特殊字符,该字符当然不会在明文中使用,以便您可以在解密时将其过滤掉。第一个明智的谷歌结果显示了一个python示例here

    如果您不能识别特殊字符,请使用正确的填充。例如,您可以使用一些随机字符填充键的下一个倍数,加密填充的明文,并在返回密文时只需添加添加的字符数。解密时,只需删除表示填充字符数的最后一个数字字符。使用置换密码解密密文并删除填充的字符,因为您现在知道它有多少。

  2. 只是不处理最后一个块。这可能是长按键的问题,因为明文的末尾将清晰可见。