이 기사에서는 DES 대칭 암호화 알고리즘을 기반으로 Java가 구현 한 암호화 및 암호 해독 기능에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
DES 암호화 관련 카테고리 :
Securrandom은 java.util.random 클래스에서 상속됩니다
이 클래스의 세 가지 유형의 생성자가 있습니다. 다음 예는 다음과 같습니다.
Securerandom ()은 기본 랜덤 번호 알고리즘을 구현하는 보안 랜덤 번호 생성기 (RNG)를 구성합니다.
Securandom (Byte [] Seed)는 기본 임의 숫자 알고리즘을 구현하는 보안 랜덤 번호 생성기 (RNG)를 구성합니다.
Deskeyspec은 원래 키를 사용하여 키의 키 내용을 생성하는 데 사용됩니다.
Deskeyspec에는 두 가지 생성자가 있습니다.
Deskeyspec (byte [] key)는 키의 첫 8 바이트를 DES 키의 키 내용으로 사용하여 Deskeyspec 객체를 만듭니다.
Deskeyspec (byte [] 키, int 오프셋)는 키의 첫 8 바이트를 사용하여 Deskeyspec 객체를 생성합니다.
키 (Opic Encryption Key of Type Key)를 키 사양 (기본 키 재료의 투명한 표현)으로 변환하는 데 사용되는 키 공장 인 SecretKeyFactory. Secret Key Factory는 비밀 (대칭) 키에서만 작동합니다.
Secretkey Object, Secret Key Object는 Secret Key Factory의 생성 된 Secret (Deskeyspec Desktop Space) 메소드를 호출하여 Secret Key를 생성합니다.
암호 클래스는 암호화 및 암호 해독에 대한 암호 기능을 제공하고 Cipher 's GetInstance ( "des")를 호출하여 인스턴스를 얻습니다.
암호 개체는 init () 메소드를 호출하여 객체를 초기화합니다. init () 메소드의 특정 매개 변수는 암호화 및 해독 된 상수를 포함하여 특정 상황에 따라 결정됩니다.
마지막으로 암호화 및 암호 해독에 대한 Cipher의 Dofinal () 메소드를 호출하십시오.
여기서 질문을하고 싶습니다. Base64encoder를 사용한 첫 번째 유형의 인코딩 유형이든, 두 번째 유형의 org.apache.commons.codec.binary.base64 인코딩을 인코딩 할 때, 바이트로 바이트로 변환 할 때, UTF-8/GBK 및 기타 인코딩이 인코딩에 필요합니다. 디코딩 되었습니까?
1. 디코딩 및 인코딩을 위해 Sun.Misc.Base64Decoder 및 Base64encoder를 사용하십시오
package com.soufun.com; import java.io.ioexception; import java.security.nosuchalgorithmexception; import java.security.securerandom; import java.util.date; import javax.crypto.cipher; import javax.crypto.secretkey; javax.crypto.secretto javax.crypto.spec.deskeyspec; // Sun import Sun.Misc.base64Decoder의 64 비트 인코딩 64 비트 인코딩; import Sun.Misc.base64Encoder;/** *@whd * *Encoder SUN.MISC 패키지를 가져 오더라도 오류 가보고됩니다. 현재 JRE 패키지를 제거하고 다시 가져올 수 있습니다. */public class desutil {// 암호화 방법 정의 개인 최종 정적 문자열 des = "des"; 개인 최종 정적 문자열 UTF8 = "GBK"; 정적 비밀 점도 keyfactory = null; static {try {keyfactory = secretKeyFactory.getInstance ( "des"); } catch (nosuchalgorithmexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); }} public static void main (string [] args)은 예외를 던집니다. {long begin = new Date (). gettime (); 문자열 data = "Aaades 암호화 테스트"; // 참고 : DES 암호화 및 암호 해독 프로세스 중에 키 길이는 8의 배수 여야합니다. String key = "Qazwsxed"; System.err.println (암호화 (데이터, 키)); System.err.println (decrypt (암호화 (데이터, 키), 키); Long End = 새 날짜 (). gettime (); System.out.println (End-Begin); } / ** * 설명 키 값에 따라 암호화 * @param data * @param 키 암호화 키 바이트 배열 * @rerrows Exception * / public static string encrypt (문자열 데이터, 문자열 키) 예외 던지기 {// 지정된 인코딩을 사용하여 암호화 할 내용을 얻습니다. 일반적으로 비밀 키는 인코딩을 지정하지 않고 문자 또는 숫자이지만 지정된 것은 바이트 [] bt = alcrypt (data.getBytes (utf8), key.getBytes (UTF8)) 일 수도 있습니다. // 참고 : 암호화 및 해독 할 때 Sun 's Base64encoder ()를 인코딩 및 디코딩에 사용하십시오. 그렇지 않으면 차량 코드가 있습니다 .//i 온라인으로 많은 인스턴스를 보았지만 인코딩 및 디코딩이 없으며 차량 코드 문제가 없습니다. 여기에 코드가 차량화되어 있으므로 Strsts = New Base64encoder (). Encode (bt); Return strs; } / ** * 설명 키 값에 따른 해독 * @param data * @param 키 암호화 키 바이트 배열 * @return * @throws exception * / public static string decrypt (문자열 데이터, 문자열 키)는 ioexception, 예외 {if (data == null) return null; // 참고 : 암호화 및 해독 할 때 Sun 's Base64Encoder ()를 인코딩 및 디코딩에 사용하십시오. 그렇지 않으면 BASE64DECODER DECODER = NEW BASE64DECODER (); 바이트 [] buf = decoder.decodebuffer (데이터); 바이트 [] bt = decrypt (buf, key.getBytes ()); 새 문자열을 반환합니다 (BT, UTF8); } / ** * 설명 키 값에 따라 암호화 * @param data * @param 키 암호화 키 바이트 배열 * @return * @throws Exception * / private static byte [] encrypt (byte [] data, byte [] 키) 예외 {// 신뢰할 수있는 무작위 숫자 소스 Securrandom sr = new securrandom (); // 원래 키 데이터에서 Deskeyspec 객체를 만듭니다. // 키 공장은 키 (OPIC 암호화 키의 OPIC 암호화 키)를 키 사양 (기본 키 자료의 투명한 표현)으로 변환하는 데 사용되며 그 반대도 마찬가지입니다. Secret Key Factory는 비밀 (대칭) 키에서만 작동합니다. // 여기에서 싱글 톤 모드를 대신 사용 // secretKeyFactory keyFactory = secretKeyFactory.getInstance (DES); // 제공된 키 사양 (키 자료)에 따라 SecretKey (키) 객체를 생성합니다. Secretkey SecureKey = keyfactory.generatesEcret (DKS); // 암호 개체는 실제로 암호화 작업을 완료 하고이 클래스는 암호화 및 암호 해독에 대한 암호 함수를 제공합니다. 암호 암호 = cipher.getinstance (des); // 키와 임의의 소스 로이 암호를 초기화합니다. Encrypt_mode는 암호화 모드를 위해 Cipher를 상수로 초기화하는 데 사용됩니다. cipher.init (cipher.encrypt_mode, securekey, sr); // 암호화 작업의 공식 실행 cipher.dofinal (데이터); } / ** * 설명 키 값에 따른 해독 * @param data * @param 키 암호화 키 바이트 배열 * @return * @throws 예외 * / private static byrypt [] decrypt (byte [] data, byte [] key) 예외 {// 신뢰할 수있는 무작위 숫자 소스 Securrandom sr = new securrandom (); // 원래 키 데이터에서 Deskeyspec 객체를 만듭니다. // 키 공장은 키 (OPIC 암호화 키의 OPIC 암호화 키)를 키 사양 (기본 키 자료의 투명한 표현)으로 변환하는 데 사용되며 그 반대도 마찬가지입니다. Secret Key Factory는 비밀 (대칭) 키에서만 작동합니다. // 여기에서 싱글 톤 모드를 대신 사용 // secretKeyFactory keyFactory = secretKeyFactory.getInstance (DES); // 제공된 키 사양 (키 자료)에 따라 SecretKey (키) 객체를 생성합니다. Secretkey SecureKey = keyfactory.generatesEcret (DKS); // 암호 클래스는 암호화 및 암호 해독에 대한 암호 함수를 제공합니다. 암호 암호 = cipher.getinstance (des); // decrypt_mode는 암호 해독 모드에서 암호를 일정하게 초기화하는 데 사용됩니다. cipher.init (cipher.decrypt_mode, securekey, sr); // 공식 암호 해독 작업 반환 cipher.dofinal (데이터); }}2. org.apache.commons.codec.binary.base64를 사용하여 디코딩 및 인코딩을 사용하십시오
package com.soufun.com; import java.io.ioexception; import java.security.nosuchalgorithmexception; import java.security.securerandom; import java.util.date; import javax.crypto.cipher; import javax.crypto.secretkey; javax.crypto.secretto javax.crypto.spec.deskeyspec; import org.apache.commons.codec.binary.base64;/** *@author whd * */public class desutil {// 암호화 메소드 정의 개인 정적 문자열 des = "des"; 개인 최종 정적 문자열 UTF8 = "GBK"; 정적 비밀 점도 keyfactory = null; static {try {keyfactory = secretKeyFactory.getInstance ( "des"); } catch (nosuchalgorithmexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); }} public static void main (string [] args)은 예외를 던집니다. {long begin = new Date (). gettime (); 문자열 data = "Aaades 암호화 테스트"; // 참고 : DES 암호화 및 암호 해독 중에 키 길이는 8의 배수 여야합니다. String key = "Qazwsxed"; System.err.println (암호화 (데이터, 키)); System.err.println (decrypt (암호화 (데이터, 키), 키); Long End = 새 날짜 (). gettime (); System.out.println (End-Begin); } / ** * 설명 키 값에 따라 암호화 * @param data * @param 키 암호화 키 바이트 배열 * @rerrows Exception * / public static string encrypt (문자열 데이터, 문자열 키) 예외 {// 지정된 인코딩을 사용하여 암호화 할 내용을 얻습니다. 일반적으로 키는 인코딩을 지정하지 않고 문자 또는 숫자이지만 지정된 것은 바이트 [] bt = alcrypt (data.getBytes (utf8), key.getBytes ()) 일 수도 있습니다. // 첫 번째는 sun.misc.base64encoder를 사용합니다. 인코딩되지만 org.apache.commons.codec.binary.base64를 사용하는 것이 더 좋으므로 String strs = base64.encodebase64string (bt); Return strs; } / ** * 설명 키 값에 따른 해독 * @param data * @param 키 암호화 키 바이트 배열 * @return * @throws exception * / public static string decrypt (문자열 데이터, 문자열 키)는 ioexception, 예외 {if (data == null) return null; // org.apache.commons.codec.binary.base64를 사용하여 바이트를 decode [] buf = base64.decodebase64 (data); 바이트 [] bt = decrypt (buf, key.getBytes ()); 새 문자열을 반환합니다 (BT, UTF8); } / ** * 설명 키 값에 따라 암호화 * @param data * @param 키 암호화 키 바이트 배열 * @return * @Throws Exception * / private static byte [] encrypt (byte [] data, byte [] key) 예외 {// 신뢰할 수있는 무작위 숫자 소스 Securrandom sr = new securrandom (); // 원래 키 데이터에서 Deskeyspec 객체를 만듭니다. // 키 공장은 키 (OPIC 암호화 키의 OPIC 암호화 키)를 키 사양 (기본 키 자료의 투명한 표현)으로 변환하는 데 사용되며 그 반대도 마찬가지입니다. Secret Key Factory는 비밀 (대칭) 키에서만 작동합니다. // 여기에서 싱글 톤 모드를 대신 사용 // secretKeyFactory keyFactory = secretKeyFactory.getInstance (DES); // 제공된 키 사양 (키 자료)에 따라 SecretKey (키) 객체를 생성합니다. Secretkey SecureKey = keyfactory.generatesEcret (DKS); // 암호 개체는 실제로 암호화 작업을 완료 하고이 클래스는 암호화 및 암호 해독에 대한 암호 함수를 제공합니다. 암호 암호 = cipher.getinstance (des); // 키와 임의의 소스 로이 암호를 초기화합니다. Encrypt_mode는 암호화 모드를 위해 Cipher를 상수로 초기화하는 데 사용됩니다. cipher.init (cipher.encrypt_mode, securekey, sr); // 암호화 작업의 공식 실행 cipher.dofinal (데이터); } / ** * 설명 키 값에 따른 해독 * @param data * @param 키 암호화 키 바이트 배열 * @return * @throws 예외 * / private static byrypt [] decrypt (byte [] data, byte [] key) 예외 {// 신뢰할 수있는 무작위 숫자 소스 Securrandom sr = new securrandom (); // 원래 키 데이터에서 Deskeyspec 객체를 만듭니다. // 키 공장은 키 (OPIC 암호화 키의 OPIC 암호화 키)를 키 사양 (기본 키 자료의 투명한 표현)으로 변환하는 데 사용되며 그 반대도 마찬가지입니다. Secret Key Factory는 비밀 (대칭) 키에서만 작동합니다. // 여기에서 싱글 톤 모드를 대신 사용 // secretKeyFactory keyFactory = secretKeyFactory.getInstance (DES); // 제공된 키 사양 (키 자료)에 따라 SecretKey (키) 객체를 생성합니다. Secretkey SecureKey = keyfactory.generatesEcret (DKS); // 암호 클래스는 암호화 및 암호 해독에 대한 암호 함수를 제공합니다. 암호 암호 = cipher.getinstance (des); // decrypt_mode는 암호 해독 모드에서 암호를 일정하게 초기화하는 데 사용됩니다. cipher.init (cipher.decrypt_mode, securekey, sr); // 공식 암호 해독 작업 반환 cipher.dofinal (데이터); }}1과 2에 사용 된 패키지의 주소를 다운로드하십시오.
다운로드 : sun.misc.base64decoder.
다운로드 : Apache의 Base64 인코딩, 디코더.
3. 인코딩이 사용되지 않고 패키지를 디코딩하지 않습니다
package com.soufun.com; import java.io.ioexception; import java.security.nosuchalgorithmexception; import java.util.date; import java.util.hashmap; import java.util.map; import javax.crypto.cipher; import javax.cipher.secretky; javax.crypto.secretkeyfactory; import javax.crypto.spec.deskeyspec; import javax.crypto.spec.ivparameterspec;/** *@author whd * */public class descrypt {정적 비밀 요점 비밀 keyfactory = null; // cipher의 "알고리즘/패턴/충전"정적 최종 문자열 cipher = "des/cbc/pkcs5padding"; static {try {// 비밀 키 프로젝트를 가져옵니다. SecretKeyFactory = SecretKeyFactory.getInstance ( "des"); } catch (nosuchalgorithmexception e) {e.printstacktrace (); }} // 상수 정의, 형식을 인코딩 개인 정적 최종 문자열 UTF8 = "GBK"; /** 객체 캐시 용 컨테이너*/ 정적 초록 클래스 캐시 {개인 최종 맵 innerCache = new Hashmap (); 보호 된 추상 개체 CreateValue (Object Key)는 예외를 던집니다. 공용 객체 get (객체 키)은 예외 {객체 값; 동기화 (InnerCache) {value = innercache.get (키); if (value == null) {value = new CreationPlaceHolder (); innerCache.put (키, 값); }} if (CreationPlaceHolder의 값 인스턴스) {Synchronized (value) {CreationPlaceHolder Progress = (CreationPlaceHolder) 값; if (progress.value == null) {progress.value = createValue (key); 동기화 (InnerCache) {InnerCache.put (key, progress.value); }} return progress.value; }} 반환 값; } 정적 최종 클래스 CreationPlaceHolder {객체 값; }} / * * hex-> str & str-> hex * / public static bd for (int i = 0; i <digest.length; i ++) {문자열 bytestring = ss.substring (2 * i, 2 * i+2); int bytevalue = integer.parseint (bytestring, 16); 다이제스트 [i] = (바이트) 바이트 값; } 반환 다이제스트; } public static string hextostring (byte b []) {StringBuffer hexstring = new StringBuffer (); for (int i = 0; i <b.length; i ++) {String PlainText = integer.toHexString (0xff & b [i]); if (plainText.length () <2) {hexstring.append ( "0"); } hexstring.append (PlainText); } return hexstring.toString (); } private static byte [] _convertKeyiv (문자열 텍스트)는 ioException {if (text.length () == 8) {return text.getBytes (utf8); } if (text.startSwith ( "0x") && text.length () == 32) {byte [] result = new Byte [8]; for (int i = 0; i <text.length (); i+= 2) {if (text.charat (i ++) == '0'&& ac } catch (예외 e) {Throw new ioException ( "txt '" + text + "'가 잘못되었습니다!"); }}} 반환 결과; } 새로운 ioexception을 던지십시오 ( "txt '" + text + "' '는 유효하지 않습니다!"); } /** SecretKey & IVParameterspec의 캐시* / 개인 정적 캐시 비밀 KASESECS = new Cache () {보호 된 개체 createEvalue (개체 키) 예외 {secretkey secretkeyobj = null; try {secretkeyobj = secretkeyFactory.generatesEcret (new deskeyspec (_convertKeyiv ((String) key))); } catch (예외 e) {e.printstacktrace (); } return secretkeyObj; }}; 개인 정적 캐시 ivparamspecs = new Cache () {Protected Object CreateEvalue (Object Key)는 예외를 던졌습니다 {ivparameterspec ivobj = null; ivobj = 새로운 ivparameterspec (_convertkeyiv ((String) 키)); 반환 Ivobj; }}; /** 암호화 및 암호 해독*/ public static string encrypt (문자열 텍스트, 문자열 authkey, String authiv) {Secretkey SecretKeyObj = null; ivparameterspec ivobj = null; {secretkeyobj = (SecretKey) increckeyspecs.get (Authkey); ivobj = (ivparameterspec) ivparamspecs.get (authiv); } catch (예외 e) {e.printstacktrace (); } byte [] data = null; try {data = text.getBytes (utf8); } catch (예외 e) {e.printstacktrace (); } byte [] authtoken = null; try {authtoken = encrypt (data, secretkeyobj, ivobj); } catch (예외 e) {e.printstacktrace (); } return HextOstring (Authtoken); } public static bd cipher.init (cipher.encrypt_mode, secretkey, iv); 반환 cipher.dofinal (데이터); } public static String decrypt (String hexstring, String Authkey, String Authiv) 예외 {secretkey secretkeyobj = null; ivparameterspec ivobj = null; {secretkeyobj = (SecretKey) increckeyspecs.get (Authkey); ivobj = (ivparameterspec) ivparamspecs.get (authiv); } catch (예외 e) {e.printstacktrace (); } 문자열 text = decrypt (hexstring, secretkeyobj, ivobj); 리턴 텍스트; } public static String decrypt (문자열 메시지, SecretKey SecretKey, ivparameterspec iv) 예외 {byte [] data = StringToHex (메시지); 반환 해독 (Data, SecretKey, IV); } public static string decrypt (byte [] data, secretkey secretkey, ivparameterspec iv) 예외 {cipher cipher = cipher.getinstance (cipher); cipher.init (cipher.decrypt_mode, secretkey, iv); 바이트 [] retbyte = cipher.dofinal (데이터); 새 문자열 (Retbyte)을 반환합니다. } public static void main (string [] args)은 예외를 던집니다. {long begin = new Date (). gettime (); 문자열 authkey = "w8f3k9c2"; 문자열 authiv = "w8f3k9c2"; 문자열 text = "Aaades 암호화 테스트"; // 140cb412ba03869f // 140cb412ba03869f // 원본 문자열 암호화 encryptedText = encrypt (텍스트, Authkey, Authiv); System.out.println ( "EncryptedText :" + EncryptedText); // ciphertext String을 복원하십시오 PlainText = Decrypt (EncryptedText, Authkey, Authiv); System.out.println ( "일반 텍스트 :" + 일반 텍스트); // 2A329740CE15F549BE64190B183A5BE2 long end = new Date (). gettime (); System.out.println (End-Begin); }}추신 : 암호화 및 암호 해독에 관심이있는 친구들 도이 사이트의 온라인 도구를 참조 할 수도 있습니다.
비밀번호 보안 온라인 탐지 :
http://tools.vevb.com/password/my_password_safe
고강도 비밀번호 생성기 :
http://tools.vevb.com/password/createstrongpassword
Thunder, Express 및 Tornado URL 암호화/암호 해독 도구 :
http://tools.vevb.com/password/urlrethunder
온라인 해시/해시 알고리즘 암호화 도구 :
http://tools.vevb.com/password/hash_encrypt
온라인 MD5/HASH/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160 암호화 도구 :
http://tools.vevb.com/password/hash_md5_sha
온라인 SHA1/SHA224/SHA256/SHA384/SHA512 암호화 도구 :
http://tools.vevb.com/password/sha_encode
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.