암호화에서 Rijndael 암호화 방법으로도 알려진 AES (Advanced Encryption Standard)는 미국 연방 정부가 채택한 블록 암호화 표준입니다. 이 표준은 원래 DES를 대체하는 데 사용되며 여러 당사자가 분석했으며 전 세계적으로 널리 사용됩니다.
대부분의 AES 계산은 특정 유한 도메인에서 수행됩니다.
AES 암호화 프로세스는 "상태"라고도하는 4 × 4 바이트 매트릭스에서 작동하며 초기 값은 일반 텍스트 블록입니다 (매트릭스의 요소 크기는 일반 텍스트 블록의 바이트입니다). 암호화 중에 (Rijndael 암호화 방법은 더 큰 블록을 지원하고 매트릭스 행 카운트가 적절하게 증가 할 수 있습니다), 각 AES 암호화 루프 (마지막 라운드 제외)는 4 단계를 포함합니다.
MixColumns 단계는 마지막 암호화 루프에서 생략되어 다른 AddRoundkey로 대체됩니다.
기본 Java 구현 :
패키지 com.stone.security; import java.util.arrays; javax.crypto.cipher 가져 오기; javax.crypto.keygenerator import; javax.crypto.secretkey import; import javax.crypto.spec.ivparameterspec; / *** AES 알고리즘 대칭 암호화, 암호화의 고급 암호화 표준은 2005 년에 효과적인 표준이되었습니다.*/ public class aes {정적 암호 암호; 정적 최종 문자열 key_algorithm = "aes"; 정적 최종 문자열 cipher_algorithm_ecb = "aes/ecb/pkcs5padding"; 정적 최종 문자열 cipher_algorithm_cbc = "aes/cbc/pkcs5padding"; /** * AES/CBC/NOPADDING 요구 사항 * 키는 16 비트 여야합니다. 초기화 벡터 (iv)는 16 비트 여야합니다 * 암호화 할 내용의 길이는 16의 배수 여야합니다. 16의 배수가 아닌 경우 다음 예외가 나타납니다. 원래의 데이터 길이는 16 배입니다. 원래 데이터 길이가 16*n 인 경우 암호화 된 데이터 길이는 Nopadding을 사용할 때 16*n과 같으며, 다른 경우 암호화 된 데이터 길이는 16*n입니다. 16 개 미만의 정수 배수의 경우, 원래 데이터 길이가 16*n+m [여기서 m이 16 미만인 경우],*노파딩 패딩을 제외한 어떤 식 으로든 암호화 된 데이터 길이는 16*(n+1)입니다. */정적 최종 문자열 cipher_algorithm_cbc_nopadding = "aes/cbc/nopadding"; 정적 비밀 비밀 키; public static void main (string [] args)은 예외 {방법 1 ( "a*jal) K32J8CZX 국가가 전국적으로 넓습니다"); Method2 ( "a*jal) K32J8CZX 국가는 전국적으로 넓습니다"); Method3 ( "A*JAL) K32J8CZX는 국가의 위생입니다"); Method4 ( "123456781234는 국가의 위생입니다"); // length = 16 method4 ( "12345678abcdefgh"); // length = 16}/** * AES 알고리즘을 암호로 사용하여 기본 모드 AES/eCB */static void method1 (String Strows Exception = {cipher =). cipher.getinstance (key_algorithm); // KeyGenerator는 AES 알고리즘 Key SecretKey = keyGenerator.getInstance (key_algorithm) .generatekey (); System.out.println ( "키의 길이는" + secretkey.getencoded (). 길이); cipher.init (cipher.encrypt_mode, secretkey); // 암호화 모드를 사용하여 키를 초기화합니다 [] alcrypt = cipher.dofinal (str.getBytes ()); // 단일 배트 작업에 따라 데이터를 암호화하거나 해독하거나 멀티 파트 작업을 종료합니다. System.out.println ( "Method1-Encrypted :" + arrays.tostring (encrypt)); cipher.init (cipher.decrypt_mode, secretkey); // 암호 해독 모드 바이트 [] decrypt = cipher.dofinal (encrypt)을 사용하여 키를 초기화합니다. System.out.println ( "Method1-decrypted :" + new String (decrypt)); }/** * AES 알고리즘, 기본 모드 AES/ECB/PKCS5Padding */static void method2 (string str)를 사용하여 암호화했습니다. // KeyGenerator는 AES 알고리즘 Key SecretKey = keyGenerator.getInstance (key_algorithm) .generatekey (); System.out.println ( "키의 길이는" + secretkey.getencoded (). 길이); cipher.init (cipher.encrypt_mode, secretkey); // 암호화 모드 바이트를 사용하여 키를 초기화합니다 [] alcrypt = cipher.dofinal (str.getBytes ()); // 단일 배트 작업에 따라 데이터를 암호화하거나 해독하여 멀티 부품 작업을 종료합니다. System.out.println ( "Method2 암호화 :" + arrays.tostring (encrypt)); cipher.init (cipher.decrypt_mode, secretkey); // 암호 해독 모드 바이트 [] decrypt = cipher.dofinal (encrypt)을 사용하여 키를 초기화합니다. System.out.println ( "Method2-Decrypted :" + new String (decrypt)); } static byte [] getiv () {문자열 iv = "1234567812345678"; // IV 길이 : 16 바이트 길이 반환 IV.getBytes (); }/** * AES 알고리즘을 사용하여 암호화, 기본 모드 AES/CBC/PKCS5Padding */static void method3 (String Str) 예외 {cipher = cipher.getInstance (cipher_algorithm_cbc); // KeyGenerator는 AES 알고리즘 Key SecretKey = keyGenerator.getInstance (key_algorithm) .generatekey (); System.out.println ( "키의 길이는" + secretkey.getencoded (). 길이); cipher.init (cipher.encrypt_mode, secretkey, new ivparameterspec (getiv ()); // 암호화 모드 byte [] alcrypt = cipher.dofinal (str.getBytes ())를 사용하여 키를 초기화합니다. // 단일 배트 작업에 따라 데이터를 암호화하거나 해독하거나 멀티 파트 작업을 종료합니다. System.out.println ( "Method3-encrypted :" + arrays.tostring (encrypt)); cipher.init (cipher.decrypt_mode, secretkey, new ivparameterspec (getiv ()); // 암호 해독 모드 바이트 [] decrypt = cipher.dofinal (encrypt)을 사용하여 키를 초기화합니다. System.out.println ( "Method3-Decrypted :" + new String (decrypt)); }/*** AES 알고리즘을 사용하여 암호화, 기본 모드 AES/CBC/Nopadding이 모드의 데이터 제한 사항을 참조하십시오*/static void method4 (String) 예외 {cipher = cipher.getInstance (cipher_algorithm_cbc_nopadding); // KeyGenerator는 AES 알고리즘 Key SecretKey = keyGenerator.getInstance (key_algorithm) .generatekey (); System.out.println ( "키의 길이는" + secretkey.getencoded (). 길이); cipher.init (cipher.encrypt_mode, secretkey, new ivparameterspec (getiv ()); // 암호화 모드 byte [] alcrypt = cipher.dofinal (str.getBytes (), 0, str.length ())를 사용하여 키를 초기화합니다. // 단일 배트 작업에 따라 데이터를 암호화하거나 해독하여 멀티 부품 작업을 종료합니다. System.out.println ( "Method4-Encrypt :" + arrays.tostring (encrypt)); cipher.init (cipher.decrypt_mode, secretkey, new ivparameterspec (getiv ()); // 암호 해독 모드 바이트 [] decrypt = cipher.dofinal (encrypt)을 사용하여 키를 초기화합니다. System.out.println ( "Method4-Decrypted :" + new String (decrypt)); }}