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 = ""; 輸出結果加密前 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\??
8 回答

三國紛爭
TA貢獻1804條經驗 獲得超7個贊
因為已經不是UTF-8字符串數據了,親。你加密了啊。DES產生的是不可讀的二進制數據,你強行用new String按照UTF-8編碼解釋,當然是亂碼了,如果能直接讀出來,要加密何用?
因為大多數基于數學算法加密的數據,產生的都是二進制塊或者流數據。只有解密了才能讀到原文。
如果你希望加密后的數據能夠存儲為文本或者HTTP傳輸,你可以將數據用BASE64編碼,編碼后就是ASCII字符串,不會亂碼了(當然人還是看不懂)。

繁星coding
TA貢獻1797條經驗 獲得超4個贊
這可能是你沒有理解內存字節(jié)數據流與字符串的區(qū)別
如果你使用文本編輯器16進制顯示查看過數據, 那么你就不會有此疑問了.
String為什么能顯示出字符串, 那是因為內存數據符合一定編碼規(guī)則的內存數據, 比如UTF-8編碼.
但一般des加密后的數據都是一些完全的內存數據流, 他是不符合字符串編碼規(guī)則的, 所以你強行用字符串編碼規(guī)則去解析它時, 就會變成"亂碼".
但加密的目的不正就讓人看不懂嗎?
是亂碼就對了
添加回答
舉報
0/150
提交
取消