我试图填充一个字节数组,一次2个字节。我的hw是密码学hw。我要使用密钥从给定的密文中找到纯文本。密钥长度为2个字节。纯文本用很多时间垫加密。密钥重复直到纯文本为止。我得到了密钥的前2个字节,现在我只需要重复它直到它的密文/纯文本。
与纯文本长度相同的密文长度是640138.密钥应该也是这个长度,但是我在应用下面的解决方案后得到的密钥长度是640144.在下面做Math.min而不是Math.max给出错误String.checkBoundsBeginEnd。我不得不将其转换为字符串,因为构建器是StringBuilder类型。在这种情况下,“结果”是关键。
只要密文长度,我如何制作密钥?
byte[] cipherText = Files.readAllBytes(Paths.get("src/cipher3.bmp"));
byte[] plainText = new byte[cipherText.length];
byte[] pText = new byte[]{'B', 'M'};
byte[] key = new byte[pText.length];
for(int i = 0; i < pText.length; i++){
key[i] = (byte)(cipherText[i] ^ pText[i]);
}
String keyString = Arrays.toString(key);
System.out.println("The key " + keyString);
System.out.println("First two in ptext"+ Arrays.toString(pText));
System.out.println(plainText.length);
String plainlength = (String) Arrays.toString(new int[]{plainText.length});
System.out.println(plainlength);
StringBuilder builder = new StringBuilder(cipherText.length);
while(builder.length() < cipherText.length){
builder.append(keyString.substring(0, Math.max(keyString.length(), builder.length() -cipherText.length)));
}
String result = builder.toString();
System.out.println(result);
System.out.println(result.length());//this gives 640144
应该使用Math.min
来正确填充。该
java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-640138
让你知道出了什么问题。负面输入应用于subString
方法,显然它必须是Math.min(keyString.length(), builder.length() -cipherText.length
。由于cipherText
长度必须大于或等于builder
长度,因此应交换参数以给出正确的结果。
public class Fill2ByteToArray {
public static void main(String[] args) throws IOException {
int targetLength = 640138;
byte[] cipherText = new byte[targetLength];
for (int i = 0; i < cipherText.length; i++) {
cipherText[i] = Integer.valueOf(i).byteValue();
}
byte[] plainText = new byte[cipherText.length];
byte[] pText = new byte[] { 'B', 'M' };
byte[] key = new byte[pText.length];
for (int i = 0; i < pText.length; i++) {
key[i] = (byte) (cipherText[i] ^ pText[i]);
}
String keyString = Arrays.toString(key);
System.out.println("The key " + keyString);
System.out.println("First two in ptext" + Arrays.toString(pText));
System.out.println(plainText.length);
String plainlength = (String) Arrays.toString(new int[] { plainText.length });
System.out.println(plainlength);
StringBuilder builder = new StringBuilder(cipherText.length);
while (builder.length() < cipherText.length) {
builder.append(keyString.substring(0, Math.min(keyString.length(), cipherText.length-builder.length())));
}
String result = builder.toString();
System.out.println(result);
System.out.println(result.length());
}
}