Ошибка дешифрования JAVA: необходимо, чтобы входное значение было кратным 16 - PullRequest
1 голос
/ 28 февраля 2012

Я пытаюсь разработать простую программу шифрования / дешифрования.Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь расшифровать зашифрованное сообщение, я получаю сообщение об ошибке, в котором говорится, что длина ввода должна быть кратна 16 при дешифровании с помощью шифра.Я где-то читал, что зашифрованное сообщение, возможно, должно быть закодировано перед преобразованием его в строку.Я не уверен, как это сделать?Или, если есть альтернативный способ, может кто-нибудь помочь мне?

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;


public class Cryption {
    public static void cryption(String[] args, String message) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {
        byte[] encodedKey = "ADBSJHJS12547896".getBytes();
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        Key aesKey = keyGen.generateKey();

        System.out.println("CheckType: "+ Global.checkType);
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        byte[] input = Global.message.getBytes();

        // Check if clicked Encrypted
        if(Global.checkType==true) {
            // Encrypt
            byte[] messageEncrypted = cipher.doFinal(input);
            System.out.println("Encrypted Text: " + messageEncrypted);
            Global.encValue = messageEncrypted.toString();
        }

        // Check if clicked Decrypted
        if(Global.checkType==false) {
            //String mes = message;
            System.out.println(Global.message);
            System.out.println("Char lenght " + Global.message.length());
            byte[] mesByte = Global.message.getBytes();


            // Decrypt
            cipher.init(Cipher.DECRYPT_MODE, aesKey);
            byte[] messageDecrypted = cipher.doFinal(mesByte);
            System.out.println("Text Decrypted: " + new String(messageDecrypted));
        }
    }

}

Ответы [ 2 ]

1 голос
/ 28 февраля 2012
Global.encValue = messageEncrypted.toString();

Это совершенно неправильно, так как он просто вызывает byte []. ToString (), который не дает вам содержимого, просто вещь с именем класса и хэш-кодом в нем.Это также неправильно семантически, поскольку String не является контейнером для двоичных данных.Не превращайте зашифрованный текст в строку.Используйте массив byte [], который дал вам API.

0 голосов
/ 28 февраля 2012

Посмотрите на http://docs.oracle.com/javase/tutorial/i18n/text/string.html

Это, вероятно, означает, что он не знает, является ли это ASCII или UTF8 или какой-либо другой байтовой кодировкой ...

...