猿问

使用给定加密算法的 Base64 解密(DES base64、secretKey、Cipher)

当我通过以下代码加密密码!QAZxdr5 时:


public static String encryptPassword(String msg) {

    try {

        KeySpec keySpec = new DESKeySpec(msg.getBytes());

        SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(keySpec);

        Cipher ecipher = Cipher.getInstance(key.getAlgorithm());

        ecipher.init(Cipher.ENCRYPT_MODE, key);

        //Encode the string into bytes using utf-8

        byte[] utf8 = msg.getBytes("UTF8");

        //Encrypt

        byte[] enc = ecipher.doFinal(utf8);

        //Encode bytes to base64 to get a string

        return new String(Base64.getEncoder().encode(enc));

    } catch (InvalidKeyException e) {

        e.printStackTrace();

    } catch (InvalidKeySpecException e) {

        e.printStackTrace();

    } catch (NoSuchAlgorithmException e) {

        e.printStackTrace();

    } catch (NoSuchPaddingException e) {

        e.printStackTrace();

    } catch (IllegalStateException e) {

        e.printStackTrace();

    } catch (IllegalBlockSizeException e) {

        e.printStackTrace();

    } catch (BadPaddingException e) {

        e.printStackTrace();

    } catch (UnsupportedEncodingException e) {

        e.printStackTrace();

    }

    return null;

}

我得到了输出:QQiu2a4NT9YfDAtmHjbk1A==


现在我尝试为此创建解密:


public static String decrypt(String msg) {

    try {

        KeySpec keySpec = new DESKeySpec(msg.getBytes());

        SecretKey key = 

        SecretKeyFactory.getInstance("DES").generateSecret(keySpec);

        Cipher decipher = Cipher.getInstance(key.getAlgorithm());

        decipher.init(Cipher.DECRYPT_MODE, key);

        // Decode base64 to get bytes

        byte[] dec = Base64.getDecoder().decode(msg.getBytes("UTF-8"));

        //Decrypt

但是,它无法正常工作,因为它返回 null :(。你能帮忙检查一下我错在哪里吗?


MMTTMM
浏览 312回答 2
2回答

慕雪6442864

在 DES 加密中,它使用相同的密钥来加密和解密消息。因此,对于这两个操作,您需要具有相同的密钥。在您的情况下,您使用了与密钥和密码相同的字符串。public static String encryptPassword(String msg) {    try {        KeySpec keySpec = new DESKeySpec(msg.getBytes());在上面的代码段中,当创建新的 DESKeySpec 对象时,您也需要传递密钥。public static String decrypt(String msg) {    try {        KeySpec keySpec = new DESKeySpec(msg.getBytes());即使在上面的解密方法中,您也必须传递在加密方法中使用的相同密钥。但是在这里你已经给出了编码字符串来生成密钥。那就是你出错的地方。因此,我建议您通过添加一个更多参数作为键来更改方法参数,然后在两种方法中为键传递相同的值。  public static String encryptPassword(String msg, String keySp) {        try {            KeySpec keySpec = new DESKeySpec(keySp.getBytes());            }    public static String decrypt(String msg, String keySp) {            try {                KeySpec keySpec = new DESKeySpec(keySp.getBytes());                }我只包含了需要更改的行。您可以通过以下方式调用这些方法,String key = "!QAZxdr5";String password = "!QAZxdr5";String encriptedPassword = encryptPassword(password, key);System.out.println(decrypt(encriptedPassword, key));
随时随地看视频慕课网APP

相关分类

Java
我要回答