如何设置用户输入的密码来加密用户在Java中输入的字符串?

时间:2018-10-07 17:14:25

标签: java encryption

我的代码有问题。说明如下: 该项目具有以下要求:

  1. 向用户询问一个字符串。
  2. 使用用户输入的密码对字符串进行加密。加密过程使用Java中实现的DES密码进行。
  3. 在控制台中打印加密的字节数组。
  4. 将消息解密回原始字节数组,然后在控制台中打印。

我在第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 :(得分:0)

一种方法是使用基于密码的加密技术。

您可以找到示例代码段here

基本上,您使用密码字符,将其与盐一起哈希,然后将结果用作加密密钥。散列可确保获得所需的用于加密的位数,而与密码的长度无关。

无论如何,通过输入验证来强制使用强密码始终是一个好主意。

通常,一个强密码(截至2018年)被认为具有8个以上的字符,同时具有大写和小写字符以及一些特殊字符(例如-,_,%,$,#,@)和数字。 / p>

PS:上面的链接用于AES加密,但是您应该能够将其用于DES(使用MD5代替SHA-256)。

可以找到另一个使用DES进行基于密码的加密的示例here

致谢

拉文德拉