@Domus

Можно ли так лихо переходить от byte[] к int?

Добрый день!
Необходимо производить операции над битами. У меня такая цепочка String -> byte[8] -> int(32) 2 шт. И в обратном порядке.

Написал код, но выдаёт ошибку:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 22
at com.company.ng.Ng.s(Ng.java:67)
Это строчка bytes[z] = (byte) block[z][bytes[z]]; в методе s().

Видимо, что-то происходит в тот момент, когда перевожу данные, потому что в цикле получаю значения bytes[z] равные -1, -22.. Подскажите пожалуйста, в чём у меня ошибка?

package com.company.ng;

import java.nio.ByteBuffer;

public class Ng {
    private byte[] L, R, C;
    private int bufL, bufR;
    private int[][] block = {
            {4,10,9,2,13,8,0,14,6,11,1,12,7,15,5,3},
            {14,11,4,12,6,13,15,10,2,3,8,1,0,7,5,9},
            {5,8,1,13,10,3,4,2,14,15,12,7,6,0,9,11},
            {7,13,10,1,0,8,9,15,14,4,6,12,11,2,5,3},
            {6,12,7,1,5,15,13,8,4,10,9,14,0,3,11,2},
            {4,11,10,0,7,2,1,13,3,6,8,5,9,12,15,14},
            {13,11,4,1,3,15,5,9,0,10,14,7,6,8,2,12},
            {1,15,13,0,5,7,10,4,9,2,3,14,6,11,8,12}
    };

    public String encrypt(String message, String key){
        String answer = "";
        if(key.length() < 32){
            System.out.println("Ключ дожен состоять из 32+ символов.");
        }else{
            byte[][] K = new byte[8][4];
            for(int z=0; z<K.length; z++){
                K[z] = key.substring(z*4, z*4+4).getBytes();
            }
            L = message.substring(0, 4).getBytes();
            R = message.substring(4, 8).getBytes();

            bufL = 0;
            bufR = 0;
            for(int i=0; i<30; i++){
                int j = 0;
                if(i<=23) j = i%8;
                else j = 31-i;

                bufL = ByteBuffer.wrap(L).getInt();
                bufR = ByteBuffer.wrap(L).getInt();

                int V = bufR;
                bufR = bufL ^ f(bufR, ByteBuffer.wrap(K[j]).getInt());
                bufL = V;
            }
            bufL = bufL ^ f(bufR, ByteBuffer.wrap(K[0]).getInt());

            L = ByteBuffer.allocate(4).putInt(bufL).array();
            R = ByteBuffer.allocate(4).putInt(bufR).array();
            C = new byte[8];
            System.arraycopy(L,0,C, 0, L.length);
            System.arraycopy(R,0,C, 4, L.length);
            answer = new String(C);
        }
        return answer;
    }

    private int f(int R, int K){
        int v = (R+K)%(2^32);
        v = s(v);
        v = rol11(v);

        return v;
    }
    private int s(int v){
        byte[] bytes = ByteBuffer.allocate(4).putInt(v).array();
        for(int z=0; z<bytes.length; z++){
            bytes[z] = (byte) block[z][bytes[z]];
        }
        v = ByteBuffer.wrap(bytes).getInt();

        return v;
    }
    private int rol11(int v){
        v = ((v << 11) | (v >>> 21));
        return v;
    }
}
  • Вопрос задан
  • 106 просмотров
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08
Тебе в ошибке предельно ясно сказано: ArrayIndexOutOfBoundsException. Ты вышел за пределы массива, смотри с какими индексами ты обращаешься к block.
Всмотрись внимательно в эту строчку `bytes[z] = (byte) block[z][bytes[z]];` и подумай что она делает. bytes[z] может равняться например '9' и твоя программулечка сразу упадет потому что в block у тебя никак не 10 элементов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы