Java: моя система расшифровки текста не работает

У меня есть система для шифрования текстов, но я пытался создать систему для расшифровки текстов, и она не работает. Система:

  • инициализировать зашифрованный текст в byte[]

  • инициализировать расшифрованный текст зашифрованным текстом

Он просто возвращает зашифрованный текст, но не расшифрованный текст. У вас есть идея для отладки этого?

Заранее спасибо.

byte[] getEncrypt(String text) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException
{
    String key = "Bép12345Taruy'(";

    Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES");

    cipher.init(Cipher.ENCRYPT_MODE, aesKey);
    byte[] encrypted = cipher.doFinal(text.getBytes());

    return encrypted;
}

String getDecrypt(String text) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException
{
    String key = "Bép12345Taruy'(";

    Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES");

    cipher.init(Cipher.ENCRYPT_MODE, aesKey);
    byte[] encrypted = cipher.doFinal(text.getBytes());

    cipher.init(Cipher.DECRYPT_MODE, aesKey);
    String decrypted = new String(cipher.doFinal(encrypted));

    return decrypted;
}

Также поделитесь кодом, где вы используете эти функции.

Himanshu Bhardwaj 29.05.2019 15:25

Одна вещь неверна: ваш метод getEncrypt возвращает строку, но зашифрованный текст состоит из байтов, которые не могут быть сохранены в строке. Не делайте new String(encrypted). Сделайте так, чтобы метод возвращал byte[] вместо String. Строка не является подходящим контейнером для произвольных байтов.

Jesper 29.05.2019 15:28

может быть, byte[] в строку Base64. Я думаю, что это правильная практика, если я ошибаюсь.

Himanshu Bhardwaj 29.05.2019 15:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы шифруете зашифрованный текст в своем методе getDecrypt(...). Или вы хотите зашифровать и расшифровать его снова одним методом?

Одним из решений будет следующий код:

package test;

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.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class Test2{        

    public static void main(String[] args) throws InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException {
        System.out.println(new String(getEncrypt("test")));
        System.out.println(new String(getDecrypt(getEncrypt("test"))));
        
    }

    public static byte[] getEncrypt(String text) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        String key = "Bép12345Taruy'(";

        Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES");

        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        byte[] encrypted = cipher.doFinal(text.getBytes());

        return encrypted;
    }

    public static byte [] getDecrypt(byte[] encrypted) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        String key = "Bép12345Taruy'(";

        Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES");

        cipher.init(Cipher.DECRYPT_MODE, aesKey);
        return cipher.doFinal(encrypted);
    }
    
}

Выход:

�'���+~�@��@w

test

Большое спасибо за Вашу помощь !

El Donaldo 29.05.2019 15:39

Я использую джасыпт для шифрования паролей. Метод очень прост.

BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword("some_Password_Maybe_generated_At_random");
...
String myEncryptedText = textEncryptor.encrypt(myText);
...
String plainText = textEncryptor.decrypt(myEncryptedText);

Обычно я не помещаю пароль в источник, а сохраняю его в файле в домашнем каталоге пользователя.

Шифрование настолько надежно, насколько безопасен и приватен домашний каталог пользователя.

Этот метод хорош тем, что возвращает строку, которую можно поместить в конфигурационный файл.

Как я уже говорил, это не безопасно для очень, оно будет защищать зашифрованный текст до тех пор, пока пароль шифрования безопасен.

Другие вопросы по теме

Похожие вопросы

Как изменить изображение и текст активности в соответствии с щелчком элемента списка в студии Android? джава или котлин
Пользовательский тип объекта JPA @JoinColumn
Как отформатировать заданную дату «31.12.9999» в формате «гггг/ММ/дд ЧЧ:мм:сс»
Как избежать получения «отсутствующего оператора возврата» при вызове метода, который создает исключение, из другого метода?
Как ввести несколько переменных разного типа в одну строку? Например -> строка строка int строка int
Почему другая строка соответствует шаблону?
Как сгруппировать мои данные с пользовательской матрицей расстояний, используя метод CLARANS библиотеки улыбок
Как очистить поле после того, как я установил значение ComboBox как нулевое?
Вызов методов в двух разных ReactiveMongoRepository в транзакции с использованием Spring Data MongoDB?
Зависимости Maven загружены, но сборка завершается с ошибкой StackOverflowError