Невозможно исправить ошибку: длина входных данных должна быть кратна 16 при расшифровке с помощью шифратора

Привет! Я работаю с приложением чата, которое шифрует свои данные с помощью AES/CBC/PKCS5 Padding. Он работает через клиент, отправляющий зашифрованное сообщение на сервер, где оно отправляется обратно и расшифровывается. К сожалению, всякий раз, когда я расшифровываю сообщение, я получаю следующее сообщение об ошибке: javax.crypto.IllegalBlockSizeException: Длина ввода должна быть кратна 16 при расшифровке с помощью дополненного шифра. Шифрование основано на этой программе :(http://www.scottjjohnson.com/blog/AesWithCbcExample.java), который отлично работает, и я не вижу разницы между моим кодом и этим, за исключением того, что я должен преобразовать строку в массив байтов. Вот мой код кода:

Клиент (шифрование):

String message = textField.getText();
// generate a key
KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128);  // To use 256 bit keys, you need the "unlimited strength" encryption policy files from Sun.
byte[] key = keygen.generateKey().getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");

// build the initialization vector.  This example is all zeros, but it 
// could be any value or generated using a random number generator.
byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
IvParameterSpec ivspec = new IvParameterSpec(iv);

// initialize the cipher for encrypt mode
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);

// encrypt the message
byte[] encrypted = cipher.doFinal(message.getBytes());
System.out.println("Ciphertext: " + encrypted + "\n");
System.out.println(encrypted);
out.println(encrypted);
textField.setText(""); 

Сторона сервера:

String input = in.readLine();
writer.println("MESSAGE " + input);

Клиент (расшифровка):

//DECRYPTION
System.out.println(line);
line = line.substring(8);
System.out.println(line);

// generate a key
KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128);  // To use 256 bit keys, you need the "unlimited strength" encryption policy files from Sun.
byte[] key = keygen.generateKey().getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");

// build the initialization vector.  This example is all zeros, but it 
// could be any value or generated using a random number generator.
byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
IvParameterSpec ivspec = new IvParameterSpec(iv);

// reinitialize the cipher for decryption
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec);

// decrypt the message
byte[] decrypted = cipher.doFinal(line.getBytes());
System.out.println("Plaintext: " + new String(decrypted) + "\n");
messageArea.append(name + ": " + decrypted + "\n");
messageArea.setCaretPosition(messageArea.getDocument().getLength());

person Silver    schedule 20.08.2013    source источник
comment
похожих вопросов много, поищите.   -  person Henry    schedule 20.08.2013
comment
Ха-ха, я исследовал все эти вопросы на прошлой неделе. Моя проблема не в самой ошибке, а в том, как я продолжаю ее получать, хотя мой ввод кратен 16.   -  person Silver    schedule 21.08.2013


Ответы (1)


Ваша проблема не имеет ничего общего с криптографией. Вы не можете правильно передать свои данные между вашими клиентами и сервером.

Я вполне уверен, что out.println(encrypted) не то, чем вы хотите заниматься, хотя мне не совсем ясно, так как я не знаю тип out. Вы также не должны вызывать line.getBytes() в своем коде дешифрования.

Вы должны преобразовать зашифрованный текст в строковую форму без потерь, такую ​​как шестнадцатеричная или base64. Так что постарайтесь:

out.println(DatatypeConverter.printHexBinary(encrypted));

а также

byte[] decrypted = cipher.doFinal(DatatypeConverter.parseHexBinary(line));
person Duncan Jones    schedule 20.08.2013
comment
Хм, это больше не выдает старую ошибку, но теперь я получаю новую: javax.crypto.BadPaddingException: данный последний блок не заполнен должным образом. - person Silver; 21.08.2013
comment
Любая идея о том, как это исправить? - person Silver; 21.08.2013