2013-08-21 215 views
9

我有這個簡單的代碼,我在互聯網上找到..即時通訊學習這個加密/解密的東西..這段代碼似乎工作正常,但我不明白的東西...爲什麼在「c.doFinal()」(用於AES-256加密/解密)之後,這個傢伙使用BASE64對該加密值進行編碼/解碼?它僅僅通過使用AES還不夠?加密與AES-256 Java

`private static final String ALGO = "AES"; 
private static final byte[] keyValue = 
new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' }; 


public static String encrypt(String Data) throws Exception { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance("AES"); 
    c.init(Cipher.ENCRYPT_MODE, key); 
    byte[] encVal = c.doFinal(Data.getBytes()); 
    String encryptedValue = new BASE64Encoder().encode(encVal); 
    return encryptedValue; 
} 

public static String decrypt(String encryptedData) throws Exception { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance(ALGO); 
    c.init(Cipher.DECRYPT_MODE, key); 
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); 
    byte[] decValue = c.doFinal(decordedValue); 
    String decryptedValue = new String(decValue); 
    return decryptedValue; 
} 
private static Key generateKey() throws Exception { 
    Key key = new SecretKeySpec(keyValue, ALGO); 
    return key; 
} 

public static void main(String[] args) throws Exception { 

    String data = "SOME TEXT"; 
    String dataEnc = AES.encrypt(data); 
    String dataDec = AES.decrypt(dataEnc); 

    System.out.println("Plain Text : " + data); 
    System.out.println("Encrypted Text : " + dataEnc); 
    System.out.println("Decrypted Text : " + dataDec); 
}` 

謝謝!!

+1

這實際上是使用128位AES而不是256.密鑰是16字節; 16字節*每字節8位= 128位密鑰。 – megaflop

回答

9

doFinal返回的加密數據是二進制的,因此無法打印(它將顯示爲一堆亂碼)Base64編碼將二進制文件轉換爲一組ASCII字符,這使得它易於閱讀並且也可以在只能使用明文數據的情況下使用加密數據。

Base64編碼不會添加任何額外的加密或安全性,只是在您無法使用二進制文件的情況下使加密數據可用。

4

生成的AES-256加密值可以包含一些不尋常的字符,這些字符在打印或通過互聯網發送時,可能會被修改或誤解,截斷或在傳輸或視覺表示時被替換。

Base64提供了一種編碼/解碼值的機制,因此它們可以「旅行」而不會修改內容。編寫此代碼的用戶找到了,可能需要存儲或傳輸此值。

您可以自己嘗試,並在編碼爲Base64之前檢查生成的字符串。

+0

是的,你是對的。我在這裏問過之前就試過了,並且印上了「??」這樣的東西。「 - 」。我正在開發一個程序,我需要通過互聯網發送數據..所以我認爲我應該在發送 –

+0

事實之前在base64中進行編碼..我嘗試打印它由「 System.out.println(new String(encVal,」 ASCII 「));」 –

0

由於doFinal()返回一個字節數組,字節通常很難理解。撇開這個程序做一個AES-128不是AES-256。