มาตรฐานการเข้ารหัสขั้นสูง (AES) หรือที่เรียกว่าวิธีการเข้ารหัส Rijndael ในการเข้ารหัสเป็นมาตรฐานการเข้ารหัสบล็อกที่รัฐบาลสหรัฐนำมาใช้ มาตรฐานนี้ใช้เพื่อแทนที่ DES ดั้งเดิมและได้รับการวิเคราะห์โดยหลายฝ่ายและใช้กันอย่างแพร่หลายทั่วโลก
การคำนวณ AES ส่วนใหญ่จะทำในโดเมน จำกัด เฉพาะ
กระบวนการเข้ารหัส AES ทำงานบนเมทริกซ์ 4 × 4 ไบต์หรือที่เรียกว่า "สถานะ" และค่าเริ่มต้นของมันคือบล็อกธรรมดา (ขนาดองค์ประกอบในเมทริกซ์เป็นไบต์ในบล็อกธรรมดา) (วิธีการเข้ารหัส Rijndael รองรับบล็อกขนาดใหญ่และจำนวนแถวเมทริกซ์สามารถเพิ่มขึ้นได้ตามความเหมาะสม) ในระหว่างการเข้ารหัสแต่ละรอบของลูปการเข้ารหัส AES (ยกเว้นรอบสุดท้าย) มี 4 ขั้นตอน:
ขั้นตอน MixColumns ถูกละเว้นในลูปเข้ารหัสครั้งสุดท้ายและแทนที่ด้วย addroundKey อื่น
การใช้งาน Java ขั้นพื้นฐาน:
แพ็คเกจ com.stone.security; นำเข้า Java.util.Arrays; นำเข้า Javax.crypto.cipher; นำเข้า Javax.crypto.keyenerator; นำเข้า Javax.crypto.secretkey; นำเข้า Javax.crypto.spec.ivparameterspec; / *** การเข้ารหัสอัลกอริทึม AES Symmetric, มาตรฐานการเข้ารหัสขั้นสูงในการเข้ารหัสกลายเป็นมาตรฐานที่มีประสิทธิภาพในปี 2005*/ คลาสสาธารณะ AES {cipher cipher แบบคงที่; สตริงสุดท้ายคงที่ key_algorithm = "AES"; สตริงสุดท้าย cipher_algorithm_ecb = "aes/ecb/pkcs5padding"; สตริงสุดท้ายคงที่ cipher_algorithm_cbc = "aes/cbc/pkcs5padding"; /** * ข้อกำหนด AES/CBC/Nopadding * คีย์ต้องเป็น 16 บิต; การเริ่มต้นเวกเตอร์ (iv) จะต้องเป็น 16 บิต * ความยาวของเนื้อหาที่จะเข้ารหัสจะต้องเป็นหลายของ 16 ถ้ามันไม่ได้เป็นหลายของ 16 ข้อยกเว้นต่อไปนี้จะปรากฏขึ้น: * Javax.crypto.illegalblockseexception: ความยาวอินพุตไม่ได้เป็นหลายครั้ง ความยาวคือ n คูณจำนวนเต็ม 16 ถ้าความยาวข้อมูลดั้งเดิมเท่ากับ 16*n ความยาวข้อมูลที่เข้ารหัสจะเท่ากับ 16*n เมื่อใช้ nopadding*ในกรณีอื่น ๆ ความยาวข้อมูลที่เข้ารหัสเท่ากับ 16*n ในกรณีที่มีจำนวนเต็มน้อยกว่า 16 ครั้งหากความยาวข้อมูลดั้งเดิมเท่ากับ 16*n+m [โดยที่ m น้อยกว่า 16],*ไม่ว่าด้วยวิธีใดก็ตามยกเว้นการขยาย nopadding ความยาวข้อมูลที่เข้ารหัสเท่ากับ 16*(n+1) */สตริงสุดท้ายคงที่ cipher_algorithm_cbc_nopadding = "aes/cbc/nopadding"; SecretKey SteectKey คงที่; โมฆะคงที่สาธารณะหลัก (String [] args) โยนข้อยกเว้น {method1 ("A*JAL) K32J8CZX ประเทศกว้างแห่งชาติ"); Method2 ("A*JAL) K32J8CZX ประเทศเป็นประเทศกว้าง"); Method3 ("A*JAL) K32J8CZX เป็นสุขาภิบาลของประเทศ"); Method4 ("123456781234 คือการสุขาภิบาลของประเทศ"); // length = 16 method4 ("12345678abcdefgh"); // length = 16}/** * ใช้อัลกอริทึม AES เพื่อเข้ารหัส cipher.getInstance (key_algorithm); // keygenerator สร้างอัลกอริทึม AES secretKey = keygenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("ความยาวของคีย์คือ:" + secretkey.getEncoded (). ความยาว); cipher.init (cipher.encrypt_mode, secretkey); // เริ่มต้นคีย์โดยใช้โหมดเข้ารหัสไบต์ [] encrypt = cipher.dofinal (str.getBytes ()); // เข้ารหัสหรือถอดรหัสข้อมูลตามการดำเนินการส่วนเดียวหรือสิ้นสุดการดำเนินการหลายส่วน System.out.println ("Method1-encrypted:" + array.toString (เข้ารหัส)); cipher.init (cipher.decrypt_mode, secretkey); // เริ่มต้นคีย์โดยใช้โหมดถอดรหัสไบต์ [] decrypt = cipher.dofinal (เข้ารหัส); System.out.println ("Method1-decrypted:" + สตริงใหม่ (decrypt)); }/** * เข้ารหัสโดยใช้อัลกอริทึม AES, โหมดเริ่มต้น AES/ECB/PKCS5PADDING */โมฆะคงที่วิธีการ 2 (String str) โยนข้อยกเว้น {cipher = cipher.getInstance (cipher_algorithm_ecb); // keygenerator สร้างอัลกอริทึม AES secretKey = keygenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("ความยาวของคีย์คือ:" + secretkey.getEncoded (). ความยาว); cipher.init (cipher.encrypt_mode, SecretKey); // เริ่มต้นคีย์โดยใช้โหมดเข้ารหัสไบต์ [] encrypt = cipher.dofinal (str.getBytes ()); // เข้ารหัสหรือถอดรหัสข้อมูลตามการดำเนินการส่วนเดียวหรือสิ้นสุดการดำเนินการหลายส่วน System.out.println ("Method2-encrypted:" + array.toString (เข้ารหัส)); cipher.init (cipher.decrypt_mode, secretkey); // เริ่มต้นคีย์โดยใช้โหมดถอดรหัสไบต์ [] decrypt = cipher.dofinal (เข้ารหัส); System.out.println ("Method2-decrypted:" + สตริงใหม่ (decrypt)); } byte คงที่ [] getiv () {string iv = "1234567812345678"; // ความยาว iv: ต้องเป็น 16 ไบต์กลับไปที่ Iv.getBytes (); }/** * ใช้อัลกอริทึม AES เพื่อเข้ารหัสโหมดเริ่มต้น AES/CBC/PKCS5PADDING */โมฆะคงที่วิธีการ 3 (String str) โยนข้อยกเว้น {cipher = cipher.getInstance (cipher_algorithm_cbc); // keygenerator สร้างอัลกอริทึม AES secretKey = keygenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("ความยาวของคีย์คือ:" + secretkey.getEncoded (). ความยาว); cipher.init (cipher.encrypt_mode, SecretKey, IVParameterspec ใหม่ (getiv ())); // เริ่มต้นคีย์โดยใช้โหมดเข้ารหัสไบต์ [] เข้ารหัส = cipher.dofinal (str.getBytes ()); // เข้ารหัสหรือถอดรหัสข้อมูลตามการดำเนินการส่วนเดียวหรือสิ้นสุดการดำเนินการหลายส่วน System.out.println ("Method3-encrypted:" + array.toString (เข้ารหัส)); cipher.init (cipher.decrypt_mode, SecretKey, IVParameterspec ใหม่ (getiv ())); // เริ่มต้นคีย์โดยใช้โหมดถอดรหัสไบต์ [] decrypt = cipher.dofinal (เข้ารหัส); System.out.println ("Method3-decrypted:" + สตริงใหม่ (decrypt)); }/*** เข้ารหัสโดยใช้อัลกอริทึม AES, โหมดเริ่มต้น AES/CBC/Nopadding ดูด้านบนสำหรับข้อ จำกัด ข้อมูลสำหรับโหมดนี้*/โมฆะแบบคงที่ (String Str) โยนข้อยกเว้น {cipher = cipher.getInstance (cipher_algorithm_cbc_nopadding); // keygenerator สร้างอัลกอริทึม AES secretKey = keygenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("ความยาวของคีย์คือ:" + secretkey.getEncoded (). ความยาว); cipher.init (cipher.encrypt_mode, SecretKey, IVParameterspec ใหม่ (getiv ())); // เริ่มต้นคีย์โดยใช้โหมดเข้ารหัสไบต์ [] เข้ารหัส = cipher.dofinal (str.getBytes (), 0, str.length (); // เข้ารหัสหรือถอดรหัสข้อมูลตามการดำเนินการส่วนเดียวหรือสิ้นสุดการดำเนินการหลายส่วน System.out.println ("Method4-encrypt:" + array.toString (เข้ารหัส)); cipher.init (cipher.decrypt_mode, SecretKey, IVParameterspec ใหม่ (getiv ())); // เริ่มต้นคีย์โดยใช้โหมดถอดรหัสไบต์ [] decrypt = cipher.dofinal (เข้ารหัส); System.out.println ("Method4-decrypted:" + สตริงใหม่ (decrypt)); -