معيار التشفير المتقدم (AES) ، المعروف أيضًا باسم طريقة تشفير Rijndael في التشفير ، هو معيار تشفير الكتلة الذي اعتمدته الحكومة الفيدرالية الأمريكية. يتم استخدام هذا المعيار لاستبدال 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.secretkeke ؛ استيراد javax.crypto.spec.ivparameterspec ؛ / *** تشفير الخوارزمية AES ، أصبح معيار التشفير المتقدم في التشفير معيارًا فعالًا في عام 2005*/ الفئة العامة 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 ، فسيظهر الاستثناء التالي: * Javax.crypto.illegalblocksizeizeizeeizeexe. طول البيانات هو نات عدد صحيح 16 ، إذا كان طول البيانات الأصلي يساوي 16*n ، فإن طول البيانات المشفرة يساوي 16*n عند استخدام nopadding ،*في حالات أخرى ، يكون طول البيانات المشفرة يساوي 16*n. في حالة أقل من 16 مضاعفات عدد صحيح ، إذا كان طول البيانات الأصلي يساوي 16*n+m [حيث يكون M أقل من 16] ،*بأي شكل من الأشكال باستثناء حشوة nopadding ، فإن طول البيانات المشفرة يساوي 16*(n+1). */Static Final String Cipher_algorithm_cbc_nopadding = "AES/CBC/Nopadding" ؛ Static Secretkey Secretkey ؛ الفراغ الثابت العام (سلسلة [] args) يلقي الاستثناء {method1 ("A*jal) K32J8CZX Country هو الوطني") ؛ Method2 ("A*jal) K32J8CZX Country هو الوطني") ؛ الطريقة 3 ("A*jal) K32J8CZX هي الصرف الصحي في البلاد") ؛ الطريقة 4 ("123456781234 هو الصرف الصحي في البلاد") ؛ // الطول = 16 طريقة 4 ("12345678ABCDEFGH") ؛ cipher.getInstance (key_algorithm) ؛ . System.out.println ("طول المفتاح هو:" + secretKey.getenCoded (). الطول) ؛ cipher.init (cipher.encrypt_mode ، secretKey) ؛ // تهيئة المفتاح باستخدام وضع تشفير بوتي [] encrypt = cipher.dofinal (str.getBytes ()) ؛ // تشفير أو فك تشفير البيانات وفقًا لعملية من جزء واحد ، أو إنهاء عملية متعددة الأجزاء. System.out.println ("method1-incrypted:" + arrays.toString (Encrypt)) ؛ cipher.init (cipher.decrypt_mode ، secretKey) ؛ // تهيئة المفتاح باستخدام بوتي وضع decryption [] decrypt = cipher.dofinal (encrypt) ؛ System.out.println ("method1-decrypted:" + new string (decrypt)) ؛ }/** * مشفرة باستخدام خوارزمية AES ، الوضع الافتراضي AES/ECB/PKCS5Padding */static void method2 (String Str) يلقي استثناء {cipher.gher.getinstance (cipher_algorithm_ecb) ؛ . System.out.println ("طول المفتاح هو:" + secretKey.getenCoded (). الطول) ؛ cipher.init (cipher.encrypt_mode ، secretKey) ؛ // تهيئة المفتاح باستخدام بوتي وضع التشفير [] encrypt = cipher.dofinal (str.getBytes ()) ؛ // تشفير البيانات أو فك تشفيرها وفقًا لعملية من جزء واحد ، أو إنهاء عملية متعددة الأجزاء. system.out.println ("method2-incrypted:" + arrays.toString (Encrypt)) ؛ cipher.init (cipher.decrypt_mode ، secretKey) ؛ // تهيئة المفتاح باستخدام بوتي وضع decryption [] decrypt = cipher.dofinal (encrypt) ؛ System.out.println ("method2-decrypted:" + new string (decrypt)) ؛ } بايت ثابت [] getiv () {String IV = "1234567812345678" ؛ // IV الطول: يجب أن يكون 16 بايت عائد طويل IV.GetBytes () ؛ }/** * استخدم خوارزمية AES لتشفيرها ، الوضع الافتراضي AES/CBC/PKCS5PADDING */static void method3 (String str) rems {cipher = cipher.getinstance (cipher_algorithm_cbc) ؛ . System.out.println ("طول المفتاح هو:" + secretKey.getenCoded (). الطول) ؛ cipher.init (cipher.encrypt_mode ، secretkey ، ivparameterspec new (getiv ())) ؛ // تهيئة المفتاح باستخدام بوتيش تشفير [] encrypt = cipher.dofinal (str.getbytes ()) ؛ // تشفير أو فك تشفير البيانات وفقًا لعملية من جزء واحد ، أو إنهاء عملية متعددة الأجزاء. System.out.println ("method3-insrypted:" + arrays.toString (Encrypt)) ؛ cipher.init (cipher.decrypt_mode ، secretkey ، ivparameterspec (getiv ())) ؛ // تهيئة المفتاح باستخدام وضع decryption byte [] decrypt = cipher.dofinal (encrypt) ؛ System.out.println ("method3-decrypted:" + new string (decrypt)) ؛ }/*** مشفرة باستخدام خوارزمية AES ، الوضع الافتراضي AES/CBC/nopadding انظر أعلاه للحصول على قيود البيانات لهذا الوضع*/static void method4 (String str) rems {cipher = cipher.getinstance (cipher_algorithm_cbc_nopadding) ؛ . System.out.println ("طول المفتاح هو:" + secretKey.getenCoded (). الطول) ؛ cipher.init (cipher.encrypt_mode ، secretkey ، new ivparameterspec (getiv ())) ؛ // تهيئة المفتاح باستخدام بوتيش تشفير [] encrypt = cipher.dofinal (str.getBytes () ، 0 ، str.length ()) ؛ // تشفير البيانات أو فك تشفيرها وفقًا لعملية من جزء واحد ، أو إنهاء عملية متعددة الأجزاء. system.out.println ("method4-incrypt:" + arrays.toString (Encrypt)) ؛ cipher.init (cipher.decrypt_mode ، secretkey ، ivparameterspec (getiv ())) ؛ // تهيئة المفتاح باستخدام وضع decryption byte [] decrypt = cipher.dofinal (encrypt) ؛ System.out.println ("method4-dectryped:" + new String (decrypt)) ؛ }}