这是我的代码我试图创建一个置换密码。我遇到的问题是当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);
}
}
答案 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)
问题是如何在这种情况下定义以及如何继续进行。您有两种选择:
填充明文,使其成为密钥长度的倍数。应特别注意你想要的垫子。使用PKCS#7不是这种经典密码的选项。您可以使用一个特殊字符,该字符当然不会在明文中使用,以便您可以在解密时将其过滤掉。第一个明智的谷歌结果显示了一个python示例here。
如果您不能识别特殊字符,请使用正确的填充。例如,您可以使用一些随机字符填充键的下一个倍数,加密填充的明文,并在返回密文时只需添加添加的字符数。解密时,只需删除表示填充字符数的最后一个数字字符。使用置换密码解密密文并删除填充的字符,因为您现在知道它有多少。
只是不处理最后一个块。这可能是长按键的问题,因为明文的末尾将清晰可见。