2013-08-21 7 views
9

Ich habe diesen einfachen Code, dass ich im Internet gefunden .. im das Zeug von Verschlüsselungs-/Entschlüsselungs-Lernen .. Dieser Code scheint gut zu funktionieren, aber ich verstehe nicht, was ... warum nach dem "c.doFinal()" (was ist mit AES-256 zu verschlüsseln/entschlüsseln) dieser Kerl codieren/entschlüsseln diesen verschlüsselten Wert, mit BASE64? es reicht nicht nur mit AES?Verschlüsselung mit 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); 
}` 

Danke !!

+1

Dies ist tatsächlich 128-Bit-AES, nicht 256. Der Schlüssel ist 16 Bytes; 16 Bytes * 8 Bits pro Byte = 128-Bit-Schlüssel. – megaflop

Antwort

9

Die von doFinal zurückgegebenen verschlüsselten Daten sind binär und können daher nicht gedruckt werden (es erscheint als ein Haufen Kauderwelsch.) Die Base64-Codierung konvertiert die Binärdatei in eine Reihe von ASCII-Zeichen, wodurch sie leicht lesbar und lesbar wird ermöglicht es auch, die verschlüsselten Daten in Situationen zu verwenden, in denen nur Klartextdaten verwendet werden können.

Die Base64-Codierung fügt keine zusätzliche Verschlüsselung oder Sicherheit, macht es einfach die verschlüsselten Daten nutzbar in Situationen, in denen Sie nicht binär verwenden können.

4

Der resultierende verschlüsselte AES-256-Wert kann einige ungewöhnliche Zeichen enthalten, die beim Drucken oder Senden über das Internet während der Übertragung oder visuellen Darstellung geändert oder missverstanden, abgeschnitten oder ersetzt werden können.

Base64 bietet einen Mechanismus zum Codieren/Decodieren von Werten, so dass sie "reisen" können, ohne dass der Inhalt geändert wird. Der Benutzer, der diesen gefundenen Code geschrieben hat, müsste diesen Wert wahrscheinlich speichern oder transportieren.

Sie können es selbst ausprobieren und die resultierende Zeichenfolge überprüfen, bevor sie in Base64 codiert wird.

+0

Ja, du hast Recht. Ich habe es versucht, bevor ich hier fragte, und es gedruckt etwas wie "??. ????? -". Ich bin ein Programm zu entwickeln, und ich brauche Daten über das Internet zu senden .. also denke ich, dass ich in base64 vor dem Senden –

+0

tatsächlich kodieren tun sollte .. Ich habe versucht, den Druck durch „ System.out.println (new String (ENCVAL“ ASCII"));" –

0

Weil doFinal() ein Byte-Array zurückgibt und Bytes im Allgemeinen schwer zu verstehen sind. Abgesehen von diesem Programm tut ein AES-128 nicht AES-256.