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

默认排序时间排序

4 个回答

答案对人有帮助,有参考价值0答案没帮助,是错误的答案,答非所问

还是楼主的代码, 没发现什么乱码:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class DESDemo {
    public static void main(String[] args)
    {
        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());

            //解密
            cipher.init(Cipher.DECRYPT_MODE,convertedKey);
            result = cipher.doFinal(result);
            System.out.println("jdk des decrypt:" + new String(result));
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

文件保存的编码为: gb2312 的时候运行结果:

文件保存的编码为: utf-8 的时候运行结果:

因为Windows的控制台不能显示 utf-8 编码的内容, 所以我用 > 把结果输出到 11.txt 的文件中,
上面的截图中包含 11.txt 的内容, 可以看到汉字还是正确的.
11.txt 文件的编码为 utf-8.

在文件以UTF-8编码保存时, 使用下面的方式可以正确显示:

同理当文件是以gb2312编码保存的时候, 可以省略这个参数,或者指定为 gb2312 就可以正常显示了:



附: Linux 下你的代码的执行结果(文件的编码为 utf-8)
Linux 下我的Console的默认编码为UTF-8,所以可以正常显示UTF-8编码的汉字.

总结一下就是 你源文件保存的编码,与你使用 new String 时传递的第二个参数 不一致导致的.



时间: 2024-10-17 00:11:48

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

6. Java 加解密技术系列之 3DES

Java 加解密技术系列之 3DES 序 背景 概念 原理 代码实现 结束语 序 上一篇文章讲的是对称加密算法 — — DES,这篇文章打算在 DES 的基础上,继续多讲一点,也就是 3 重 DES — — Triple DES. 背景 至于 3DES 为什么会出现呢?其实,这个不难想到.由于 DES 是一种非常简便的加密算法,但是密钥长度比较短,计算量比较小,相对来说,比较容易被破解.因此,在 DES 的基础上,使用三重数据加密算法,对数据进行加密,这样来说,破解的概率就小了很多. 概念 3D

1.Java 加解密技术系列之 BASE64

Java 加解密技术系列之 BASE64 序号 背景 正文 总结 序 这段时间,工作中 用到了 Java 的加解密技术,本着学习的态度,打算从这篇文章开始,详细的研究一番 Java 在加解密技术上有什么与众不同,同时,也想为大家或者自己留下点什么,一块分享这其中的“精髓”.需要说明的是,这个系列可能要持续一段时间,因为,加解 密的相关技术太多太多了,要搞明白这些着实不是一件容易的事. 背景 说到这个加解密技 术,之前一直没有机会研究这个东西,这次公司里的项目需要加解密的支持,因此有机会能够好好研

3.Java 加解密技术系列之 SHA

Java 加解密技术系列之 SHA 序 背景 正文 SHA-1 与 MD5 的比较 代码实现 结束语 序 上一篇文章中介绍了基本的单向加密算法 — — MD5,也大致的说了说它实现的原理.这篇文章继续之前提到的单向加密,主要讲的是 SHA,同 MD5 一样,SHA 同样也是一个系列,它包括 SHA-1,SHA-224,SHA-256,SHA-384,和 SHA-512 等几种算法.其中,SHA-1,SHA-224 和 SHA-256 适用于长度不超过 2^64 二进制位的消息.SHA-384 和

160829、Java加解密与数字签名

** Java加解密 ** 实现方式:JDK实现,CC,BC JDK提供比较基础的底层的实现:CC提供一些简化的操作:BC提供补充 一.Base64加密 非常简单,加密解密就一个函数. 代码如下: 二.消息摘要算法加密————主要用于验证数据完整性. MD(消息摘要): SHA(安全散列) JDK实现和MD一样. BC实现如下:(Digest类) CC实现最简单(就是一个DigestUtils的静态方法): MAC(消息认证码)——含有密钥的散列函数算法 兼容MD和SHA的特性,但加入了密钥.

10.Java 加解密技术系列之 DH

Java 加解密技术系列之 DH 序 概念 原理 代码实现 结果 结束语 序 上一篇文章中简单的介绍了一种非对称加密算法 — — RSA,今天这篇文章,继续介绍另一种非对称加密算法 — — DH.当然,可能有很多人对这种加密算法并不是很熟悉,不过没关系,希望今天这篇文章能帮助你熟悉他. 原理 整个通信过程中g.g^a.g^b是公开的,但由于g.a.b都是整数,通过g和g^a得到a还是比较容易的,b也是如此,所以最终的“密钥”g^(a*b)还是可以被计算出来的.所以实际的过程还需要在基本原理上加入

11.Java 加解密技术系列之 总结

Java 加解密技术系列之 总结 序 背景 分类 常用算法 原理 关于代码 结束语 序 上一篇文章中简单的介绍了第二种非对称加密算法 — — DH,这种算法也经常被叫做密钥交换协议,它主要是针对密钥的保护.同时,由于水平的限制,打算这个系列就到此为止了,这篇文章就算是一个总结吧,回顾一下这几个月来都写了些什么. 背景 其 实,在开始写这个系列之前,我对于 Java 的加解密也并不是那么了解.之所以要写这些文章,还主要是由于工作的原因.记得几个月以前,当时项目要做一个数字证书,证书的生成.存储.传

9.Java 加解密技术系列之 RSA

Java 加解密技术系列之 RSA 序 概念 工作流程 RSA 代码实现 加解密结果 结束语 序 距 离上一次写博客感觉已经很长时间了,先吐槽一下,这个月以来,公司一直在加班,又是发版.上线,又是新项目太紧,具体的就不多说了,想听我吐槽的小伙伴, 可以私信给我(*^__^*) .上一篇文章,已经把对称加密的算法讲完了.从今天开始,要说说非对称加密了.因为,非对称加密真的是太重要了,我们的日常生活中,都离不开非对称加密. 概念 在说 RSA 之前,首先聊聊什么是非对称加密.在讲对称加密的时候,就曾

5.Java 加解密技术系列之 DES

Java 加解密技术系列之 DES 序 背景 概念 基本原理 主要流程 分组模式 代码实现 结束语 序 前 几篇文章讲的都是单向加密算法,其中涉及到了 BASE64.MD5.SHA.HMAC 等几个比较常见的加解密算法.这篇文章,以及后面几篇,打算介绍几个对称加密算法,比如:DES.3DES(TripleDES).AES 等.那么,这篇文章主要是对 DES 大概讲一下. 背景 在 讨论 DES 之前,首先了解一下什么是对称加密算法吧.对于对称加密算法,他应用的时间比较早,技术相对来说比较成熟,在

7.java 加解密技术系列之 AES

java 加解密技术系列之 AES 序 概念 原理 应用 代码实现 结束语 序 这篇文章继续介绍对称加密算法,至于今天的主角,不用说,也是个厉害的角色 — — AES.AES 的出现,就是为了来替代原先的 DES 标准.现在来说,AES 的用途还是非常广泛的. 概念 AES, 全称为“Advanced Encryption Standard”,中文名“高级加密标准”,在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准.AES 加密算法作为新一代的数据加密标准汇聚了强安