Как установить пароль, введенный пользователем, для шифрования строки, введенной пользователем в Java? - PullRequest
0 голосов
/ 07 октября 2018

У меня проблемы с моим кодом.Инструкции заключаются в следующем: Этот проект имеет следующие требования:

  1. Запросить у пользователя строку символов.
  2. Шифрование строки символов с использованием пароля, введенного пользователем.Процесс шифрования выполняется с использованием шифра DES, реализованного в Java.
  3. Печать в консоли зашифрованного байтового массива.
  4. Расшифровывает сообщение обратно в исходный байтовый массив и печатает его вconsole.

У меня проблемы с Шагом 2 и Шагом 4. Можете ли вы сообщить мне, что делать.Я все время получаю сообщение об ошибке: Исключение в теме "main" j

avax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:991)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
    at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
    at javax.crypto.Cipher.doFinal(Cipher.java:2164)
    at Main.main(Main.java:50)

Можете ли вы сообщить мне, что делать.

import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;
import java.util.Scanner;


public class Main {

    public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException, NoSuchPaddingException {
        Scanner scan = new Scanner(System.in);

        System.out.println("Please Input A String Of Characters:");
        String myString = scan.nextLine();

        System.out.println("Please Input a Password:");

        String passw = scan.nextLine();

        SecretKeyFactory MyKeyFactory = SecretKeyFactory.getInstance("DES");
        byte[]           mybytes      = myString.getBytes("UTF8");
        DESKeySpec       myMaterial   = new DESKeySpec(mybytes);
        SecretKey        myDESkey     = MyKeyFactory.generateSecret(myMaterial);

        Cipher desCipher = Cipher.getInstance("DES");
        desCipher.init(Cipher.ENCRYPT_MODE, myDESkey);
        byte[] myEncryptedBytes = desCipher.doFinal(mybytes);
        System.out.println(Arrays.toString(myEncryptedBytes));

        desCipher.init(Cipher.DECRYPT_MODE, myDESkey);
        byte[] myDecryptedBytes = desCipher.doFinal(mybytes);
        System.out.println(Arrays.toString(myDecryptedBytes));
    }
}

1 Ответ

0 голосов
/ 07 октября 2018

Один из способов - использовать метод шифрования на основе пароля.

Пример фрагмента кода можно найти здесь .

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

В любом случае всегда полезно применять надежные пароли посредством проверки входных данных.

Обычно считается, что надежный пароль (по состоянию на 2018 год) содержит 8+ символов с символами верхнего и нижнего регистра, а также несколько специальных символов (например, -, _,%, $, #, @) и цифры.

PS: вышеуказанная ссылка предназначена для шифрования AES, но вы должны иметь возможность адаптировать его для DES (используя MD5 вместо SHA-256).

Еще один пример, который использует DES для шифрования на основе пароля, может бытьнайдено здесь .

С уважением

Равиндра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...