欢欢19 2019-05-19 22:19 采纳率: 0%
浏览 847

为啥DES解密出错,求大佬解答

import java.util.Scanner;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.xml.bind.DatatypeConverter;

import org.apache.commons.codec.binary.Hex;

public class DES2 {

public static void main(String[] args) {

    DESEncryption();
    DESDecryption();
}

public static void DESEncryption() {

    try {

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入需要加密内容:");
        String src = sc.nextLine();

        System.out.println("请输入密钥:");
        String str1 = sc.nextLine();
        byte[] bytesKey = str1.getBytes();

        DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
        SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = factory.generateSecret(desKeySpec);

        // DES加密
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] result = cipher.doFinal(src.getBytes());
        String hex = DatatypeConverter.printHexBinary(result);
        System.out.println("Hex:" + hex.toLowerCase());
        System.out.println("DES加密:" + Hex.encodeHexString(result));

    } catch (Exception e) {
        // TODO: handle exception
    }
}

    public static void DESDecryption() {

        try {

            Scanner sc = new Scanner(System.in);
            System.out.println("请输入需要解密内容:");
            String str1 = sc.nextLine();

            System.out.println("请输入密钥:");
            String str2 = sc.nextLine();
            byte[] bytesKey = str2.getBytes();

            DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
            SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = factory.generateSecret(desKeySpec);

            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] result2 = cipher.doFinal(str1.getBytes());

            System.out.println("DES解密:" + new String(result2));
        } catch (Exception e) {
            System.out.println("解密异常");
        }
    }

}

  • 写回答

2条回答

  • 毕小宝 博客专家认证 2019-05-20 09:38
    关注

    解密过程的入参不应该是输入的,应该直接用你加密后生成的字符数组。解密字符串不是普通的字符,而需要将字节数组转码成 base64 才行。
    其次,DES 是对称加密算法,秘钥应该用相同的,
    最后一点,异常分支必须打印堆栈信息,否则不知道异常更不能查错。
    还有一点,跟 JDK 的加密套件有关系。
    参考这个 demo 重试看看。

    评论

报告相同问题?

悬赏问题

  • ¥15 MATLAB动图的问题
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名