暗号化のRijndael暗号化法としても知られる高度な暗号化標準(AES)は、米国連邦政府が採用したブロック暗号化標準です。この標準は、元のDESを交換するために使用され、複数の関係者によって分析されており、世界中で広く使用されています。
ほとんどのAES計算は、特定の有限ドメインで行われます。
AES暗号化プロセスは、「状態」とも呼ばれる4×4バイトマトリックスで動作し、その初期値はプレーンテキストブロックです(マトリックスの要素サイズはプレーンテキストブロックのバイトです)。 (Rijndael暗号化方法はより大きなブロックをサポートし、そのマトリックスの行数は必要に応じて増加させることができます)暗号化中、AES暗号化ループの各ラウンド(最後のラウンドを除く)には4つのステップが含まれます。
MixColumnsステップは最後の暗号化ループで省略され、別のAddRoundKeyに置き換えられます。
基本的なJava実装:
パッケージcom.stone.security; java.util.arraysをインポートします。 javax.crypto.cipherをインポートします。 javax.crypto.keygeneratorをインポートします。 javax.crypto.secretkeyをインポートします。 javax.crypto.spec.ivparameterspecをインポートします。 / *** AESアルゴリズム対称暗号化、暗号化の高度な暗号化標準は2005年に効果的な標準となりました*/ Public Class AES {Static cipher cipher; static final string key_algorithm = "aes"; static final string cipher_algorithm_ecb = "aes/ecb/pkcs5padding"; static final string cipher_algorithm_cbc = "aes/cbc/pkcs5padding"; /** * AES/CBC/NOPADDING要件 *キーは16ビットでなければなりません。初期化ベクトル(IV)は16ビットである必要があります *暗号化されるコンテンツの長さは16の倍数でなければなりません。16の倍数である必要があります。データの長さは16のn倍です。元のデータ長が16*nに等しい場合、暗号化されたデータの長さはnopaddingを使用すると16*nに等しくなります。 16未満の整数倍未満の場合、元のデータ長が16*n+m [mは16]に等しい場合、*ノーパジングパディングを除く何らかの形で、暗号化されたデータ長は16*(n+1)に等しくなります。 */static final string cipher_algorithm_cbc_nopadding = "aes/cbc/nopadding"; Static SecretKey SecretKey; public static void main(string [] args)スロー例外{method1( "a*jal)k32j8czx国は全国的に");方法2( "a*jal)k32j8czx国は全国的に");方法3( "a*jal)k32j8czxは国の衛生です");方法4( "123456781234は国の衛生です") cipher.getInstance(key_algorithm); // keygenerator aes algorithm key secretkey = keygenerator.getInstance(key_algorithm).generatekey(); System.out.println( "キーの長さは次のとおりです。 cipher.init(cipher.encrypt_mode、secretkey); // encryption mode byte [] encrypt = cipher.dofinal(str.getbytes())を使用してキーを初期化します。 //単一部品操作に従ってデータを暗号化または復号化するか、マルチパート操作を終了します。 system.out.println( "method1-encrypted:" + arrays.toString(encrypt)); cipher.init(cipher.decrypt_mode、secretkey); // decryptionモードByteを使用してキーを初期化[] decrypt = cipher.dofinal(encrypt); system.out.println( "method1-decrypted:" + new String(decrypt)); }/** * AESアルゴリズム、デフォルトモードAES/ECB/PKCS5PADDING */static void Method2(string str)throws exception {cipher = cipher.getInstance(cipher_algorithm_ecb); // keygenerator aes algorithm key secretkey = keygenerator.getInstance(key_algorithm).generatekey(); System.out.println( "キーの長さは次のとおりです。 cipher.init(cipher.encrypt_mode、secretkey); //暗号化モードBYTE [] Encrypt = cipher.dofinal(str.getBytes())を使用してキーを初期化します。 //単一部品操作に従ってデータを暗号化または復号化するか、マルチパート操作を終了します。 system.out.println( "Method2-encrypted:" + arrays.toString(encrypt)); cipher.init(cipher.decrypt_mode、secretkey); // decryptionモードByteを使用してキーを初期化[] decrypt = cipher.dofinal(encrypt); System.out.println( "Method2-DeCrypted:" + new String(decrypt)); } static byte [] getiv(){string iv = "1234567812345678"; // IVの長さ:16バイトの長いバージである必要があります。IV.getBytes(); }/** * AESアルゴリズムを使用して暗号化する、デフォルトモードAES/CBC/PKCS5PADDING */static void Method3(string str)throws exception {cipher = cipher.getInstance(cipher_algorithm_cbc); // keygenerator aes algorithm key secretkey = keygenerator.getInstance(key_algorithm).generatekey(); System.out.println( "キーの長さは次のとおりです。 cipher.init(cipher.encrypt_mode、secretkey、new ivparameterspec(getiv())); //単一部品操作に従ってデータを暗号化または復号化するか、マルチパート操作を終了します。 System.out.println( "Method3-Encrypted:" + arrays.ToString(encrypt)); cipher.init(cipher.decrypt_mode、secretkey、new ivparameterspec(getiv())); System.out.println( "Method3-DeCrypted:" + new String(decrypt)); }/*** AESアルゴリズムを使用して暗号化されたデフォルトモードAES/CBC/NOPADDINGこのモードのデータ制限については、上記を参照してください。 // keygenerator aes algorithm key secretkey = keygenerator.getInstance(key_algorithm).generatekey(); System.out.println( "キーの長さは次のとおりです。 cipher.init(cipher.encrypt_mode、secretkey、new ivparameterspec(getiv())); //単一部品操作に従ってデータを暗号化または復号化するか、マルチパート操作を終了します。 System.out.println( "method4-encrypt:" + arrays.toString(encrypt)); cipher.init(cipher.decrypt_mode、secretkey、new ivparameterspec(getiv())); System.out.println( "method4-Decrypted:" + new String(decrypt)); }}