加密解密 - java加解密操作过程中的中文乱码问题
黄舟
黄舟 2017-04-17 15:14:32
[Java讨论组]
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)
天蓬老师

windows系统么?换成gbk试试。

天蓬老师

题主的程序中,字符串转字节数组时没有指定编码(默认会使用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
PHPz

不大清楚,以前用过AES

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号