为什么des加密后输出乱码?

     public static void main(String args[]) {
  
            String string = "abcdef你";
           KeyGenerator keyGenerator = null;
            try {
                keyGenerator = KeyGenerator.getInstance("DES");
    
                SecretKey secretKey = keyGenerator.generateKey();
                byte[] bytesKey = secretKey.getEncoded();
                DESKeySpec desKeySpec = new DESKeySpec(bytesKey);
                SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
                SecretKey secretKey1 = factory.generateSecret(desKeySpec);
    
                Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
                cipher.init(Cipher.ENCRYPT_MODE, secretKey1);
                byte[] sbytes = string.getBytes("utf-8");
                byte[] bytes = cipher.doFinal(string.getBytes());
                System.out.println("加密前 bytes[]:" + byte2hex(sbytes));
                System.out.println("加密前string:" + new String(sbytes, "UTF-8"));
                System.out.println("加密后 bytes[]:" + byte2hex(bytes));
                System.out.println("加密后string:" + new String(bytes, "UTF-8"));
            } catch (InvalidKeyException e) {
                e.printStackTrace();
            } catch (InvalidKeySpecException e) {
                e.printStackTrace();
            } catch (BadPaddingException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (IllegalBlockSizeException e) {
                e.printStackTrace();
            } catch (NoSuchPaddingException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
    
        }
    
        private static String byte2hex(byte[] buffer) {
            String h = "";
    
            for (int i = 0; i < buffer.length; i++) {
                String temp = Integer.toHexString(buffer[i] & 0xFF);
                if (temp.length() == 1) {
                    temp = "0" + temp;
                }
                h = h + " " + temp;
            }
            return h;
        }
        

输出结果

加密前 bytes[]: 61 62 63 64 65 66 e4 bd a0
加密前string:abcdef你
加密后 bytes[]: e1 32 7c 94 ce 5d 08 f6 8f b0 af 32 5c d3 dc a5
加密后string:�2|��]����2\�ܥ
阅读 12.6k
8 个回答

因为已经不是UTF-8字符串数据了,亲。你加密了啊。DES产生的是不可读的二进制数据,你强行用new String按照UTF-8编码解释,当然是乱码了,如果能直接读出来,要加密何用?
因为大多数基于数学算法加密的数据,产生的都是二进制块或者流数据。只有解密了才能读到原文。
如果你希望加密后的数据能够存储为文本或者HTTP传输,你可以将数据用BASE64编码,编码后就是ASCII字符串,不会乱码了(当然人还是看不懂)。

加密后是字节数组,不是所有字节数组都可以通过new String()转换成字符串的

这可能是你没有理解内存字节数据流与字符串的区别
如果你使用文本编辑器16进制显示查看过数据, 那么你就不会有此疑问了.
String为什么能显示出字符串, 那是因为内存数据符合一定编码规则的内存数据, 比如UTF-8编码.
但一般des加密后的数据都是一些完全的内存数据流, 他是不符合字符串编码规则的, 所以你强行用字符串编码规则去解析它时, 就会变成"乱码".

但加密的目的不正就让人看不懂吗?

是乱码就对了

加密后就应该是读不懂的东西。

为什么你会以为不是乱码呢?

加密后一般是byte数组,转换为16进制的字符串就可以了啊

加密后可以再 Base64,

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏