加密解密 - java加解密操作过程中的中文乱码问题

 黑漆高傲的眼眸 发布于 2022-10-31 19:55
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

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

public class DESDemo {
    public static final String src = "des test";
    public static void main(String[] args)
    {
        jdkDES();
        bcDES();

    }

    private static void bcDES() {

    }

    private static void jdkDES() {
        try{
            //生成KEY
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
            keyGenerator.init(56);
            System.out.println(keyGenerator.getAlgorithm());
            System.out.println(keyGenerator.getProvider());

            SecretKey secretKey = keyGenerator.generateKey();
            byte[] bytesKey = secretKey.getEncoded();
            System.out.println(secretKey.getAlgorithm());
            System.out.println(secretKey.getFormat());

            //通过KEY转换生成密钥
            DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
            SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
            SecretKey convertedKey = factory.generateSecret(desKeySpec);

            //加密
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");// 算法/工作方式/填充方式
            cipher.init(Cipher.ENCRYPT_MODE, convertedKey);
            byte[] result = cipher.doFinal("要加密的内容".getBytes());
            System.out.println("jdk des encrypt:" + Hex.encodeHexString(result));

            //解密
            cipher.init(Cipher.DECRYPT_MODE,convertedKey);
            result = cipher.doFinal(result);
//            System.out.println("jdk des decrypt:" + new String(result));  //jdk des decrypt:?????????? 直接输出会乱码
            System.out.println("jdk des decrypt:" + new String( result,"utf-8" ));  //jdk des decrypt:??????????  依旧乱码


        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

请问windows系统默认编码是gbk吗?

3 个回答
  • 不大清楚,以前用过AES

    2022-10-31 23:32 回答
  • 题主的程序中,字符串转字节数组时没有指定编码(默认会使用Java文件编码,Windows下文本文件默认保存为GBK编码 -- 感谢 @小_秦 提醒):

    byte[] result = cipher.doFinal("要加密的内容".getBytes());

    而字节数组转字符串时指定了编码:

    System.out.println("jdk des decrypt:" + new String( result,"utf-8" )); 

    二者编码不一致造成乱码。并非是加解密过程中造成的

    解决方法很简单,字符串转字节数组时设置编码即可:

    byte[] result = cipher.doFinal("要加密的内容".getBytes("utf-8"));

    补充,为了证明并非是加解密过程中造成的,题主可以试试下面的程序在同样的环境下的运行结果,必定也是输出乱码:

    byte[] byteArray = "要加密的内容".getBytes();  // 字符串转字节数组不指定编码(默认编码)
    System.out.println(new String( byteArray ,"utf-8" ));  // 字节数组转字符串指定UTF-8
    2022-10-31 23:32 回答
  • windows系统么?换成gbk试试。

    2022-10-31 23:32 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有