Массив Java Fill по 2 байта за раз - PullRequest
0 голосов
/ 07 сентября 2018

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

1 Ответ

0 голосов
/ 07 сентября 2018

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());
    }
}
...