Длина ввода должна быть кратна 8 при расшифровке с использованием шифра - PullRequest
0 голосов
/ 12 ноября 2018

Я получил это приложение клиент-сервер: шифрование сообщения на одной стороне и дешифрование на другой стороне но при расшифровке я получаю эту ошибку "Длина ввода должна быть кратна 8 при дешифровании с использованием шифра с добавлением" Класс сервера

public class ServerApp   {

    public static byte[] encrypt(String input, Key k) {
        try {

            Cipher cipher = Cipher.getInstance("DES");
            cipher.init(Cipher.ENCRYPT_MODE, k);
            byte[] data = input.getBytes();
            byte[] result = cipher.doFinal(data);

            return result;
        } catch (Exception ex) {
            return null;
        }
    }

    public static String decrypt(byte[] cipher, Key k) {
        try {

            Cipher cipher1 = Cipher.getInstance("DES");
            cipher1.init(Cipher.DECRYPT_MODE, k);
            byte[] original = cipher1.doFinal(cipher);
            return new String(original);

        } catch (Exception ex) {
            return null;
            //Logger.getLogger(DES.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String[] args) throws NoSuchAlgorithmException {
        try {

              Key key=KeyGen.getSecretKey();
            ServerSocket ser = new ServerSocket(3333);
            System.out.println("Server Started");
            Socket client = ser.accept();
            DataInputStream in = new DataInputStream(client.getInputStream());
            DataOutputStream out = new DataOutputStream(client.getOutputStream());
            Scanner scan = new Scanner(System.in);
           // SecretSocket sc = new SecretSocket(client, KeyGen.getSecretKey());
            String serMsg, cliMsg, plain;
           // OutputStream sout = sc.getOutputStream();
          //  InputStream sin = sc.getInputStream();
            do {
                System.out.print("You say: ");
                serMsg = scan.nextLine();

             //   sout.write(serMsg.getBytes());
            //    System.out.println("cli server "+sin.read());

                byte[] ci = encrypt(serMsg, KeyGen.getSecretKey());
            System.out.println("encrypt " +ci.toString());
             out.writeUTF(ci.toString());
              plain = decrypt(ci, KeyGen.getSecretKey() );
              System.out.println("decrypt " + plain);
            } while (!serMsg.equals("end"));
            client.close();
            ser.close();
        } catch (IOException ex) {
            Logger.getLogger(ServerApp.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

и вот код клиента

public class ClientApp  {

        public static byte[] encrypt(String input, Key k) {
        try {

            Cipher cipher = Cipher.getInstance("DES");
            cipher.init(Cipher.ENCRYPT_MODE, k);
            byte[] data = input.getBytes();
            byte[] result = cipher.doFinal(data);

            return result;
        } catch (Exception ex) {
            return null;
        }
    }

    public static String decrypt(byte[] cipher, Key k) {
        try {

            Cipher cipher1 = Cipher.getInstance("DES/CBC/PKCS5Padding");
            cipher1.init(Cipher.DECRYPT_MODE, k);
            byte[] original = cipher1.doFinal(cipher);
            return new String(original);

        } catch (Exception ex) {
            return null;
            //Logger.getLogger(DES.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
        try {
            Socket s = new Socket("localhost", 3333);
            DataInputStream in = new DataInputStream(s.getInputStream());
            DataOutputStream out = new DataOutputStream(s.getOutputStream());
            Scanner scan = new Scanner(System.in);
            String serMsg, cliMsg, plain;

            do {

                System.out.println("server server "+in.readUTF());

                serMsg = in.readUTF();
                System.out.println("enc: " + serMsg);
                plain = decrypt(serMsg.getBytes("UTF-8"), KeyGen.getSecretKey());
                System.out.println("Server says: " + plain);

            } while (!serMsg.equals("end"));
            s.close();
        } catch (IOException ex) {
            Logger.getLogger(ClientApp.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Дело в том, что я попробовал ("DES / CBC / PKCS5Padding") и ("UTF-8") но все та же проблема Любая помощь ??

1 Ответ

0 голосов
/ 12 ноября 2018
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, k);
        byte[] data = input.getBytes();
        byte[] result = cipher.doFinal(data);
  1. Используя DES без IV, вы неявно используете DES/ECB/PKCS5Padding.

  2. не печатать байтовый массив напрямую. Java будет выводить только печатные символы. Всегда кодировать и декодировать массив байтов при печати (Hex или Base64 являются наиболее распространенными кодировками)

Вот пример проекта

Base64.getEncoder().encodeToString(byteArray) 
  1. Надеюсь, вы знаете, что DES сегодня считается слабым шифром и должен использоваться только для обратной совместимости.
...