Я пытаюсь заполнить массив байтов по 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