Criptografia OTP

Estou a tentar usar a criptografia OTP. Fiz algumas mudanças de modo a conseguir guardar a key junto ao dado no db. Isto é, guardei-a apos a string.

package me.mauro.testes;

import java.util.Random;

/**
 *
 * @author M4UR0
 */
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 74
        }
        

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

O problema é o seguinte: Em strings de tamanho maior que 9 dá o seguinte erro:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 14 at me.mauro.testes.Criptografia.decriptografa(Criptografia.java:74) at me.mauro.testes.Main.main(Main.java:25)

Como posso resolver isto?

Ninguem?

A linha 74 ta no codigo

cara, o problema pode ser que, pelomenos eu não vi, você não tranformou o resultado da subtração de im[i] - ik[i]; para o modulo de caracteres que você permite usar, e isso pode ter gerado uma msg maior do que a chave.

O problema era que após o while eu definia um valor errado para msg
msg = mensagem.substring(0, tamanho-tamanhoKey-1);