輸入org.springframework.util.Base64Utils。 輸入java.security.NoSuchAlgorithmException。 インポートにjava.security.SecureRandom; 輸入java.util.logging.Levelの。 輸入java.util.logging.Loggerの。 輸入javax.crypto.Cipher; 輸入javax.crypto.KeyGenerator。 輸入javax.crypto.SecretKey。 インポートするjavax.crypto.spec.SecretKeySpec; / ** * @versionのV1.0 * @desc AES加密工具类 * / パブリック クラスAESUtil { プライベート 静的な 最終文字列KEY_ALGORITHM = "AES" 。 プライベート 静的 最終 ; DEFAULT_CIPHER_ALGORITHM文字列=「AES / ECB / PKCS5Padding」変換// デフォルトの暗号化アルゴリズム / ** * AES暗号化操作 * * @paramのコンテンツ暗号化されるコンテンツ * @paramのパスワード暗号化キー * @return リターンBase64でトランスコーディングを暗号化されたデータ * / パブリック 静的な文字列を暗号化(内容文字列、文字列のパスワード){ 試み{ 暗号暗号 = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); //は、パスワードを作成するには、ある バイト [] = byteContent content.getBytes(「UTF-8」); cipher.init(Cipher.ENCRYPT_MODE、getsecretkey(パスワード)); // 初期化パスワードの暗号化モードの バイト []結果= Cipher.doFinal(byteContent); // 暗号化 // Base64では、64個の印刷可能な文字に基づいていますバイナリデータを表現する表現。 戻り Base64Utils.encodeToString(結果); // トランスバックBase64で貫通 } キャッチ(例外EX){ Logger.getLogger(AESUtil。クラス .getName())ログ(Level.SEVERE ,. ヌル、EX); } 戻り ヌル。 } / ** * AES復号 * * @paramの内容 *@paramのパスワード * @return * / パブリック 静的な文字列解読(内容文字列、文字列のパスワード){ 試み{ //がインスタンス化 暗号暗号= Cipher.getInstance(DEFAULT_CIPHER_ALGORITHMを); // キーの初期化を使用して、復号化モードに設定 cipher.init (Cipher.DECRYPT_MODE、getsecretkey(パスワード)); //は、操作を実行するには // BASE64は、バイナリデータ表現を表現するために64の印刷可能文字に基づいています。 バイト []結果= Cipher.doFinal(Base64Utils.decodeFromString(コンテンツ)); を返す 新しい新しい文字列(検索結果を、 "UTF-8" ); } キャッチ(例外EX){ Logger.getLogger(AESUtil。クラス .getName())ログ(Level.SEVERE ,. ヌル、EX); } 戻り NULL ; } / ** *生成された暗号鍵 * * @return * / プライベート 静的getsecretkey SecretKeySpec(文字列のパスワード){ // キージェネレータKeyGeneratorオブジェクトを生成するために、指定されたアルゴリズムを返し するKeyGeneratorのキログラム= NULLを、 試み{ キロ = KeyGenerator.getInstance(KEY_ALGORITHM); // AESキーの長さが必要128 kg.init(128 、新しい新しいのSecureRandom(password.getBytes())); //が生成キー のSecretKey秘密鍵= kg.generateKey(); を返す 新しい新しい SecretKeySpec(secretKey.getEncoded()、KEY_ALGORITHMを); // 秘密鍵AESを変換 } キャッチ( EX持つNoSuchAlgorithmException){ Logger.getLogger(AESUtil。クラス .getName())ログ(Level.SEVERE ,. ヌル、EX); } 戻り NULL ; } パブリック 静的 ボイドメイン(文字列[]引数){ 文字列原点 =「私のテスト文字列" ; 文字列の暗号化 = AESUtil.encrypt(原点、「パスワード」)。 文字列の解読 = AESUtil.decrypt(暗号化、 "私のパスワード" ); System.out.println(原点); System.out.println(暗号化)。 System.out.println(復号化)。 } }
プロセス上、なぜそれが符号化されることができ、BASE64によって生成される配列の解読。例外を使用することができる場合:復号化バイトのアレイは16の倍数でなければなりません
これは、文字列にバイト配列は、文字列配列)が(.getBytesを取得したときに、二バイト配列が前後に同じではないことを見出したことがわかっ
強調:他のコードに置き換え、新しい文字列(バイト[])、および「STR」.getBytes()、使用される二つの異なる符号化方法、およびそのような状況で登場しました
理由:
1. 2つのバイト配列値が異なることになる前と後の文字は、バイト数ではなく、バイトの場合、各セットは、対応関係エンコーディングを有するので、文字列の配列、文字列は、その後、アレイを向けるだろう、なぜコードセットの数字は対応していないが、新たな文字列([]バイト)をコードする、溶液は無意味な意味不明のシンボルからなる傾向がある:たとえば:,
デコード時しかし、文字コード表内の文字は、コードテーブルに対応する値を復号化しなければならないすべての値を表すために使用されるバイトの固定数は、有しているバイト配列内のバイトの数なければ正確に符号化テーブルに対応する値、またはコード、バイト配列復号は異なるであろう
神話:すべてのバイト配列するString.getBytesによって、新しい文字列()、およびすることができ誤解()の減少
この例外レポートのほかに2:復号化されたバイト配列は、AESの原則からだった16の倍数でなければなりませんが、AESは、16バイトのパケット上のデータの暗号化であり、すべての配列の長さがない場合は16の倍数は文句を言うでしょう
原理AES:AESは暗号化されたパケットの、すなわち16バイト、データのグループは、暗号化の複数ラウンドを実行する必要があるたびに、128ビットのデータです。このようになりますように、ユーザ入力キーの長さは、これらのタイプの長さではない場合、入力キーの長さ、すなわち、16バイト、24バイト、32バイト、128、192及び256であってもよいですいくつかの長さ。かかわらず、入力されたキーが異なる鍵長の組にバイト数、または暗号化データの16のバイトでの暗号化演算のラウンド数のみに影響を与えます。
それは前のような矛盾の配列を引き起こすことはありませんし、新しい文字列(バイト[])、GetBytesメソッド()、開始後、私は、ほとんどの人がBASE64を使用していることを見て、アレイは、上院の健康をBase64エンコードを使用して、デコードすることができます私は、セキュリティコーディングの追加の層は、それのいくつかは、私はエラーを引き起こすされていないbase64で配列を扱うことを期待していなかったようだと思いました