DES 암호화 알고리즘
DES는 전체 이름 데이터 암호화 표준으로, 주요 암호화를 사용하는 블록 알고리즘입니다. 1976 년 미국 연방 정부의 국가 표준 사무소에서 FIPS (Federal Data Processing Standard)로 결정되었으며 나중에 국제적으로 널리 배포되었습니다.
DES 알고리즘에는 키, 데이터 및 모드의 세 가지 항목 매개 변수가 있습니다. 그중 키는 7 바이트, 총 56 비트이며, 이는 DES 알고리즘의 작동 키입니다. 데이터는 8 바이트, 총 64 비트이며, 이는 암호화되거나 해독 될 데이터입니다. 모드는 DES의 작업 모드 : 암호화 또는 암호 해독입니다.
DES 알고리즘은 64 비트 일반 텍스트 입력 블록을 64 비트 암호 텍스트 출력 블록으로 바꿉니다. 그것이 사용하는 키는 또한 56 비트입니다. 알고리즘은 주로 두 단계로 나뉩니다.
1) 초기 순열 기능은 입력 64 비트 데이터 블록을 비트로 재조합하고 출력을 두 부분으로 나누는 것입니다. L0과 R0, 각 부품의 길이는 32 비트입니다. 순열 규칙은 58 번째 입력 비트를 첫 번째 비트로, 50 번째 비트를 두 번째 비트로 전환하는 것입니다. 그리고 마지막 비트는 원래 7 비트입니다. L0과 R0은 전치 출력 후 두 부분이며 L0은 출력의 왼쪽 32 비트이고 R0은 오른쪽 32 비트입니다. 예 : 전치 전에 D1D2D3 ... D64로 입력 값을 설정 한 다음 초기 순열 후 결과는 다음과 같습니다. L0 = D58D50 ... D8; R0 = D57D49 ... D7.
교체 규칙은 다음 표에 나와 있습니다.
58,50,42,34,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,64,56,48,40,32,24,16,8 , 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,61,53,45,37,29,21,13,63,55,47,39,31,23,15,7,
2) 16 개의 반복 작업 후 L16 및 R16이 얻어진다. 이것을 입력으로 가져 가서 역 순열을 수행하십시오. 역 순열은 정확히 초기 순열의 역 작동이므로 암호 텍스트 출력을 얻습니다.
이 알고리즘은 대칭 암호화 알고리즘 시스템을 대표하며 컴퓨터 네트워크 시스템에서 널리 사용됩니다.
기본 Java 구현
패키지 com.stone.security; java.security.key 가져 오기; java.security.securerandom import; javax.crypto.cipher 가져 오기; javax.crypto.keygenerator import; javax.crypto.secretkey import; javax.crypto.secretkeyfactory import; javax.crypto.spec.deskeyspec import; import javax.crypto.spec.ivparameterspec; / *** DES ALGORITHM 1972 미국에서 IBM이 개발 한 대칭 암호화 알고리즘*/ public class des {// 알고리즘 이름 공개 정적 최종 문자열 key_algorithm = "des"; // 알고리즘 이름/암호화 모드/채우기 메소드 공개 정적 최종 문자열 cipher_algorithm_ecb = "des/ecb/pkcs5padding"; 공개 정적 최종 문자열 cipher_algorithm_cbc = "des/cbc/pkcs5padding"; public static void main (string [] args)은 예외를 던집니다. { / * * ecb 모드 사용 * 키 생성기를 사용하여 키를 생성 * ECB 모드를 사용할 수 없습니다 iv * / byte [] key = generatekey (); 바이트 [] alcrypt = alcrypt ( "gasculitis f#*(x)". getBytes (), 키); System.out.println (새 문자열 (Decrypt (암호화, 키)); / * * CBC 모드 사용 * 키 팩토리를 사용하여 키, 암호화 및 해독을 생성하십시오 * IV : DES CBC 모드 및 OAEP 인코딩 작업이있는 RSA 암호. */ deskeyspec dks = new deskeyspec (generatekey ()); SecretKeyFactory Factory = SecretKeyFactory.getInstance (key_algorithm); Secretkey Secretkey = factory.generatesecret (DKS); cipher cipher = cipher.getinstance (cipher_algorithm_cbc); cipher.init (cipher.encrypt_mode, secretkey, 새로운 ivparameterspec (getiv ())); 바이트 [] enc = cipher.dofinal ( "gasculitis a%f#*(x)". getBytes ()); // cipher.init (cipher.decrypt_mode, secretkey, 새로운 ivparameterspec (getiv ())); 바이트 [] dec = cipher.dofinal (ENC); // decrypt system.out.println (새 문자열 (12 월); } static byte [] getiv () {문자열 iv = "asdfivh7"; // IV 길이 : 8 바이트 길이 반환 IV.getBytes (); } / ** * key * * @return * @throws Exception * / private static byte [] generatekey () rows exception {keygenerator keygenerator = keygenerator.getInstance (key_algorithm); keygenerator.init (56); // DES는 56이어야합니다.이 초기 방법은 SecretKey를 호출 할 필요가 없습니다. return secretkey.getencoded (); } / ** * Key * * @param key * @return * @throws Exception * / private static key tokey (byte [] key)는 예외 {deskeyspec des = new deskeyspec (key); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance (key_algorithm); Secretkey Secretkey = keyfactory.generatesecret (des); 리턴 비밀 키; } / *** encrypt* @param data original text* @param key* @return ciphertext* @throws 예외* / public static byte [] alcrypt (byte [] data, byte [] key) 예외 {key k = tokey (key); cipher cipher = cipher.getinstance (cipher_algorithm_ecb); cipher.init (cipher.encrypt_mode, k, new securerandom ()); 반환 cipher.dofinal (데이터); } / *** decrypt* @param data password* @param key* @return 일반 텍스트, 원본 텍스트* @throws 예외* / public static byte [] decrypt (byte [] data, byte [] key) 예외 {key k = tokey (key); cipher cipher = cipher.getinstance (cipher_algorithm_ecb); cipher.init (cipher.decrypt_mode, k, new securerandom ()); 반환 cipher.dofinal (데이터); }} Java Triple DES 구현 :
패키지 com.stone.security; javax.crypto.cipher 가져 오기; javax.crypto.keygenerator import; javax.crypto.secretkey import; javax.crypto.secretkeyfactory import; javax.crypto.spec.desedekeyspec import; import javax.crypto.spec.ivparameterspec; / ** * 트리플 암호화 3DES는 트리플 des, */ public class tripledes {// 알고리즘 이름 public static final String key_algorithm = "desede"; // 알고리즘 이름/암호화 모드/채우기 메소드 공개 정적 최종 문자열 cipher_algorithm_ecb = "Desede/ecb/pkcs5padding"; 공개 정적 최종 문자열 cipher_algorithm_cbc = "desede/cbc/pkcs5padding"; 프라이빗 키 게이터 키겐; 개인 비밀 비밀 키; 개인 비밀 비밀 Kecretkey2; 개인 암호 암호; 개인 정적 바이트 [] EncryptData; public static void main (string [] args)은 예외를 던집니다 {Tripledes = new Tripledes ( "ECB"); Tripledes.encrypt ( "sau8jzxlcvm, '123`98 (*^&%^^ JCB ZX >> a <s <}} {"); system.out.println ( "암호화 후 :" + new string (Tripledes.decrypt (encryptData)); tripledes = new Tripledes ( "CBC")); Tripledes.encrypt2 ( "sau8jzxlc dqv#> <| vm, '123`98 (*^&%^^ jcb zx >> a <s <}} {"); system.out.println ( " + new string (alcryptData));" + new strypt.out.println ( " + new strypt. string (tripledes.decrypt2 (EncryptData))} public tripledes (String Mode) {if ( "ecb" keygenerator.getinstance (key_algorithm); Desedekeyspec (keygen.generatekey (). getencoded ()); incretkeyfactory.getinstance (key_algorithm) .generatesecret (spec)}; cipher.init (cipher.encrypt_mode, secretkey); return acryptData = cipher.dofinal (str.getBytes ()); } / ** * decrypt * @param encrypt * @return * @throws Exception * / public byte [] decrypt (byte [] encrypt) 예외 {cipher.init (cipher.decrypt_mode, severkey); 반환 EncryptData = cipher.dofinal (encrypt); } byte [] getiv () {return "administ".getBytes (); } / ** * encrypt * @param str * @return * @throws Exception * / public byte [] Encrypt2 (string) 예외 {cipher.init (cipher.encrypt_mode, secretkey2, new ivparameterspec (getiv ()); return acryptData = cipher.dofinal (str.getBytes ()); } / ** * decrypt * @param encrypt * @return * @throws Exception * / public byte [] decrypt2 (byte [] encrypt)는 예외 {cipher.init (cipher.decrypt_mode, subreckey2, new ivparameterspec (getiv ()); 반환 EncryptData = cipher.dofinal (encrypt); }}