2013-08-21 32 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

これは実際には256ではなく、128ビットAESを使用しています。キーは16バイトです。 16バイト* 1バイトあたり8ビット= 128ビットのキー。 – megaflop

答えて

9

doFinalによって返される暗号化データはバイナリであるため、印刷できません(ぎこちなく表示されます)。Base64エンコーディングはバイナリをASCII文字のセットに変換します。平文データのみが使用可能な状況で暗号化されたデータを使用することも可能になる。

Base64エンコーディングは追加の暗号化やセキュリティを追加しないため、バイナリを使用できない状況で暗号化されたデータを使用できるようにします。

4

結果のAES-256暗号化された値には、送信またはインターネット経由で送信された、送信または視覚的表現の間に変更または誤解、切り捨てまたは置き換えられる特殊文字が含まれることがあります。

Base64は値をエンコード/デコードするメカニズムを提供しているため、変更されているコンテンツを使わずに「移動」することができます。あなたが見つけたこのコードを書いたユーザーはおそらく、この価値を保管したり運ぶ必要があります。

あなた自身で試して、結果の文字列をBase64にエンコードする前に確認できます。

+0

はい、そうです。私はここで尋ねる前にそれを試してみたところ、 "??"のようなものが印刷されていました。私はプログラムを開発していると私はインターネット上でデータを送信する必要がある..私は実際に –

+0

を送信する前にbase64でエンコードする必要があると思う..私は " System.out.println(新しい文字列(encVal、 ASCII ")));" –

0

doFinal()はバイト配列を返し、バイトは一般的に理解しにくいためです。このプログラムを離れると、AES-128ではなくAES-128が実行されます。

関連する問題