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

发布于 2022-09-01 19:07:55 字数 2045 浏览 25 评论 0

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吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

我要还你自由 2022-09-08 19:07:55

windows系统么?换成gbk试试。

浅唱々樱花落 2022-09-08 19:07:55

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

不大清楚,以前用过AES

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文