OTP加密错误

时间:2018-07-30 10:53:39

标签: java runtime-error

我正在尝试使用OTP加密。我进行了一些更改,以便可以将密钥保存在db中的数据旁边。也就是说,我将其保存在字符串之后。

public class Criptografia {

//CRIPTOGRAFIA OTP (One-Time-Pad) COM ALGUMAS MODIFICAÇOES

public String criptografa(String mensagem, String chave) {
    if (mensagem.length() != chave.length()) {
        error("O tamanho da mensagem e da chave devem ser iguais.");
    }
    int[] im = charArrayToInt(mensagem.toCharArray());
    int[] ik = charArrayToInt(chave.toCharArray());
    int[] data = new int[mensagem.length()];

    for (int i = 0; i < mensagem.length(); i++) {
        data[i] = im[i] + ik[i];
    }

    return new String(intArrayToChar(data)) + chave + chave.length();
}

public String decriptografa(String mensagem) {
    int tamanho = mensagem.length();

    int tamanhoKey = Integer.parseInt(mensagem.substring(tamanho-1, tamanho));
    String chave = mensagem.substring(tamanho-tamanhoKey-1,tamanho-1);
    String msg = mensagem.substring(0, tamanho-tamanhoKey-1);

    System.out.println("Mensagem Total: " + mensagem);
    System.out.println("Tamanho: " + (tamanho-tamanhoKey-1));
    System.out.println("Tamanho Key: " + tamanhoKey);
    System.out.println("Chave: " + chave);
    System.out.println("Mensagem: " + msg);

    int cont = 1; 
    try{
        while (msg.length() != chave.length()){
            cont++;
            if (cont>=5){
                error("O tamanho da mensagem e da chave devem ser iguais.");
            }

            tamanhoKey = Integer.parseInt(mensagem.substring(tamanho-cont, tamanho));
            chave = mensagem.substring(tamanho-tamanhoKey-cont,tamanho-cont);
            msg = mensagem.substring(0, tamanho-tamanhoKey-cont);
            System.out.println("\nTamanho da key: "+tamanhoKey);
            System.out.println("Key: "+chave);
            System.out.println("Mensagem: " + msg);
            System.out.println("Tamanho da mensagem: " + msg.length());

            System.out.println("\n");
        }
    }catch(NumberFormatException e){
        System.out.println("ERROR");
    }
    msg = mensagem.substring(0, tamanho-tamanhoKey-1);

    int[] im = charArrayToInt(msg.toCharArray());
    int[] ik = charArrayToInt(chave.toCharArray());
    int[] data = new int[msg.length()];

        for (int i = 0; i < msg.length(); i++) {
            data[i] = im[i] - ik[i]; //-> LINHA 25
    }


    return new String(intArrayToChar(data));
}

public String genKey(int tamanho) {
    Random randomico = new Random();
    char[] key = new char[tamanho];
    for (int i = 0; i < tamanho; i++) {
        key[i] = (char) randomico.nextInt(132);
        if ((int) key[i] < 97) {
            key[i] = (char) (key[i] + 72);
        }
        if ((int) key[i] > 122) {
            key[i] = (char) (key[i] - 72);
        }
    }
    System.out.println(key);

    return new String(key);
}

private int chartoInt(char c) {
    return (int) c;
}

private char intToChar(int i) {
    return (char) i;
}

private int[] charArrayToInt(char[] cc) {
    int[] ii = new int[cc.length];
    for (int i = 0; i < cc.length; i++) {
        ii[i] = chartoInt(cc[i]);
    }
    return ii;
}

private char[] intArrayToChar(int[] ii) {
    char[] cc = new char[ii.length];
    for (int i = 0; i < ii.length; i++) {
        cc[i] = intToChar(ii[i]);
    }
    return cc;
}

private void error(String msg) {
    System.out.println(msg);
    System.exit(-1);
}

}

问题如下:在大小大于9的字符串中给出以下错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 14 at me.mauro.testes.Cryptography.decrypt (Cryptography.java:74) at me.mauro.testes.Main.main (Main.java:25)

我不明白为什么会发生此错误。我该如何解决? 如果我忘记了什么,请告诉我。 谢谢

0 个答案:

没有答案