2016-04-26 11 views
-1

私はJavaでAESを使用しようとしています。コードスニペットが見つかりましたが、出力が間違っています。出力には多くのEF BF BDがあります。自分のコードに間違っているものが見つかりませんでしたか?JavaのAES暗号が間違っています

public class AES 
{ 
static String encryptionKey = "48C3B4286FF421A4A328E68AD9E542A4"; 
    static String clearText = "00000000000000000000000000000000"; 

    public static void main(String[] args) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException 
    { 
     encr(); 
    } 

    public static String toHexString(byte[] ba) 
    { 
     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < ba.length; i++) 
     { 
      sb.append(String.format("%02X ", ba[i])); 
     } 
     return sb.toString(); 
    } 

    public static void encr() throws InvalidKeyException, UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException 
    { 
     //Security.addProvider(new com.sun.crypto.provider.SunJCE()); 
     SecretKeySpec secretKey = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES"); 

     byte[] clearTextBytes = clearText.getBytes("UTF8"); 
     Cipher cipher = Cipher.getInstance("AES"); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
     byte[] cipherBytes = cipher.doFinal(clearTextBytes); 

     System.out.print("enc1: "); 
     for (int i = 0; i < cipherBytes.length; i++) 
     { 
      System.out.print(cipherBytes[i]); 
     } 
     System.out.println(""); 

     String cipherText = new String(cipherBytes, "UTF8"); 
     System.out.println("enc2: " + cipherText); 

     System.out.println("enc3: " + toHexString(cipherText.getBytes("UTF-8"))); 
    } 
} 

出力は次のようになります。

enc1: 51 72 -122 -57 -109 127 57 85 116 63 -89 -35 55 -72 37 -96 51 72 -122 -57 -109 127 57 85 116 63 -89 -35 55 -72 37 -96 -82 103 -117 -60 -102 -91 -51 55 -53 23 33 -82 -70 -14 74 41 
enc2: 3H�Ǔ9Ut?��7�%�3H�Ǔ9Ut?��7�%��g�Ě��7�!��� 
enc3: 33 48 EF BF BD C7 93 7F 39 55 74 3F EF BF BD EF BF BD 37 EF BF BD 25 EF BF BD 33 48 EF BF BD C7 93 7F 39 55 74 3F EF BF BD EF BF BD 37 EF BF BD 25 EF BF BD EF BF BD 67 EF BF BD C4 9A EF BF BD EF BF BD 37 EF BF BD 17 21 EF BF BD EF BF BD EF BF BD 

が、それは

33 48 86 c7 93 7f 39 55 74 3f a7 dd 37 b8 25 a0 
+0

enc1とenc2の出力は正しいですか? enc2:toHexString関数のsysout文にのみ問題があるようですね。 –

+1

新しい文字列(cipherBytes、 "UTF8")は何を期待していますか? cipherBytesにAESで暗号化されたデータが含まれ、UTF-8でエンコードされた文字が含まれていない場合に返されますか? – jarnbjo

+0

あなたはすでに必要なものがすべてあると私には見えます。 'toHexString(cipherBytes)' –

答えて

1

あなたがtoHexString(cipherText.getBytes("UTF-8"))を印刷する場合、結果は

33 48 86 C7 93 7F 39 55であるべきです74 3F A7 DD 37 B8 25 A0 33 48 86 C7 93 7F 39 55 74 3F A7 DD 37 B8 25 A0 AE 67 8B C4 9A A5 CD 37 CB 17 21 AE BA F2 4A

もしString、文字セット上のJavaドロップ無効データ・ベースにbyte[]に変換29。