我正在尝试使用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)
我不明白为什么会发生此错误。我该如何解决? 如果我忘记了什么,请告诉我。 谢谢