일반적인 암호화 알고리즘
기본 단방향 암호화 알고리즘 :
Base64 엄밀히 말하면 암호화 알고리즘이 아닌 인코딩 형식에 속합니다.
MD5 (MessageDigestAlgorithm5, 정보 다이제스트 알고리즘)
SHA (SecureHashalgorithm, Secure 해시 알고리즘)
HMAC (HashmessAgeAuthenticationCode, 해시 메시지 인증 코드)
복잡한 대칭 암호화 (DES, PBE), 비대칭 암호화 알고리즘 :
DES (Dataencryptionstandard, 데이터 암호화 알고리즘)
PBE (비밀번호 검증에 기초한 비밀번호 기반 암호)
RSA (알고리즘의 이름은 발명가의 이름을 따서 명명되었습니다 : Ronrivest, Adi Shamir 및 Leonard Adleman)
DH (Diffie-Hellman 알고리즘, 주요 일관성 프로토콜)
DSA (DigitalSignature 알고리즘, 디지털 서명)
ECC (타원 곡선 암호화)
디지털 서명
알고리즘에 대한 간단한 설명
디지털 서명 알고리즘은 키가있는 메시지 다이제스트 알고리즘으로 간주 될 수 있으며이 키에는 공개 및 개인 키가 모두 포함되어 있습니다. 즉, 디지털 서명 알고리즘은 비대칭 암호화 알고리즘과 메시지 다이제스트 알고리즘의 조합입니다.
특징
디지털 서명 알고리즘에는 데이터 무결성을 검증하고 데이터 소스를 인증하며 거부에 저항하는 역할을 수행 할 수있는 기능이 필요합니다.
원칙
Digital Signature 알고리즘에는 개인 키 서명 및 공개 키 검증 방법을 따르는 서명 및 검증의 두 가지 작업이 포함됩니다.
서명 할 때 서명 할 개인 키와 데이터를 사용해야합니다. 확인할 때는 공개 키, 서명 값 및 서명 할 데이터를 사용해야합니다. 핵심 알고리즘은 주로 메시지 다이제스트 알고리즘입니다.
1. 메시지 요약
문자열 beforedeGist = "asdf"; System.out.println ( "전"요약 : "+beforedegist); // 초기 정보는 바이트 스트림 바이트 [] PlainText = beforedegist.getBytes ("utf8 ")로 변환되어야합니다. = MessageStance ( "SHA-1"); = new String (MessageDigest.Digest (), "UTF8"); "요약 후 :"+AfterDegist);2. 개인 키 암호화
/***이 예제는 개인 키로 문자열 정보를 암호화 한 다음 개인 키로 해독하여 일관성이 있는지 확인하는 것입니다. 개인 키는 암호화되어 있으며 대칭 알고리즘을 사용하여 대칭 암호화*입니다. 예 : A는 파일을 암호화하기 위해 키를 사용하고 B와 동일한 키가 필요하며, 양 당사자는 * 개인 키를 공유합니다 (및 웹 환경에서는 개인 키가 쉽게 들릴 때 쉽게들을 수 있습니다) * * 첨부 파일 : 주요 대칭 알고리즘은 다음과 같습니다. Dest (실제 키는 56 비트 만 사용) * AES (3 개의 키 길이 : 128, 192, 256 Bits) */ <span style = "화이트 공간 : pre;"> </ span> String 이전 = "asdf"; 바이트 [] plaintext = prever.getBytes ( "utf8"); // 1 단계.
System.out.println ( "시작 시작 Key."); // AES 알고리즘 KeyGenerator keygenerator keygenerator.getInstance ( "AES")를 사용하여 KeyGenerator 인스턴스를 가져옵니다 ( "AES"); // 키 길이 128 비트 keygen.init (128); keygenerator (key algorithm)를 통과합니다. keygen.generatekey (); system.out.println ( "aes key ="+key 생성 마감);
// 2 단계.
// 개인 키 암호화 클래스 암호를 가져 오십시오. 암호의 기본 정보 정의 : ECB는 암호화 메소드이며 PKCS5Padding은 충전 메소드 CIPHER CIPHER = CIPHER.GETINSTANCE ( "AES/ECB/PKCS5PADDING"); //system.out.println("/n " + cipher.getProvider (). getInfo ());// 3 단계.
// 개인 키를 사용하여 System.out.println ( "/n 개인 키와 암호화 ..."); // 방금 생성 된 키를 매개 변수로 사용하고 지금 당장 얻은 개인 키를 사용하여 암호화 클래스를 초기화하십시오. cipher.encrypt_mode는 암호화 cipher.init (cipher.encrypt_mode, key); // 개인 키 암호화 클래스 암호가 암호화되고 암호화 후에 바이트 스트림이 반환 된 후 [] byte [] byte [] ciphertext = cipher.dofinal (plaintext); 문자열 (ciphertext, "utf8"); system.out.println ( "개인 키 암호화로 완료 :"+aff1);
// 4 단계.
[java] 일반 사본보기 // 개인 키를 사용하여 지금 암호화 된 정보를 해독하여 일관성이 있는지 확인하십시오. cipher.decrypt_mode는 암호 해독 키 시스템을 의미합니다. cipher.dofinal (ciphertext); String fapt2 = new String (newPlainText, "utf8"); System.out.println ( "개인 키로 해독 된 :"+After2);
3. 공개 키 암호화
String prever = "asdf"; byte [] plaintext = prever.getBytes ( "utf8"); // rsa 키 생성기 키어 게이터 (이름에서 알 수 있듯이 : 주요 생성기 쌍) 키 이어 게이터 keygen = keypairgenerator.getinstance ( "rsa"); keygen.initialize (1024); // KeyPairGenerator를 통해 키를 생성하십시오. 참고 : 여기의 키는 한 쌍의 키입니다! ! kyypair key = keygen.generatekeypair (); // RSA 암호 클래스 받기, 공개 키 암호 cipher = cipher.getInstance ( "rsa/ecb/pkcs1padding"); // system.out.println ( "/n" + cipher.getProvider ()); system.out.println ( "/n 공개 키로 암호화 ..."); // cipher.encrypt_mode는 암호화를 의미합니다. keys.getPublic () cipher.init (cipher.encrypt_mode, key.getpublic ()); cipher.dofinal (PlainText); // 바이트 스트림을 UTF8 형식으로 문자열로 변환합니다. System.out.println ( "공개 키 암호화 사용 :"+after1); // decrypt system.out.println ( "/ndecrypt with private key ..."); // cipher.decrypt_mode는 decryption mode를 의미합니다. 키 핵심 쌍에서 개인 키를 얻습니다. key.getPrivate ()); // 개인 키와 해독하고 바이트 스트림 바이트 [] newPlainText = cipher.dofinal (ciphertext); string after2 = new String (newPlainText, "UTF8"); System.out.println ( "개인 키와의 해독 :"+After2);
4. 디지털 서명
/***이 예제는 디지털 서명의 예입니다. RSA 개인 키를 사용하여 메시지 다이제스트에 서명 한 다음 (여기서 원래 데이터를 지칭) 공개 키를 사용하여 서명을 확인하여 B의 공개 키를 암호화하고 B의 개인 키를 사용하여 B의 개인 키를 사용하여 필요한 데이터를 얻기 위해 B의 개인 키에 의해 암호화 될 수 있습니다. B의 공개 키는 데이터 사본을 암호화하고 B로 보냅니다. 문제는 A 또는 C가 수신 한 데이터가 C에 의해 전송 된 것입니까?) * 개인 키는 독특하기 때문에 A의 개인 키를 사용하여 A의 공개 키를 사용하여 A의 메시지를 결정할 수 있습니다. B 및 A는 두 부분을 준비해야합니다. 1 및 2 * 1 : A B의 공개 키를 사용하여 원래 정보를 암호화하여 기밀로 제공 할 수는 있지만 다른 사람들만이 다른 키를 풀 수는 없으며 다른 키를 풀 수는 없습니다. 물론 기밀이 있습니다) * 2 : A는 A의 개인 정보를 사용하여 원래 정보를 사용하여 수신기 기능으로 서명하기 위해 원래 정보의 소화기를 사용하여 대상이된다. 동시에 C의 개인 키를 사용하여 B에 서명을 사용하여 B에 서명하려는 것은 A의 데이터 (예 : 전송 요청)이므로 B *는 A의 공개 키를 통해받은 두 정보를 해독합니다. prever.getBytes ( "utf8"); // RSA 공개 키 쌍 KeyPairGenerator keygen = kyypairgenerator.getInstance ( "rsa"); keygen.initialize (1024); KeyPair key = keyGen.generateKeyPair();//Sign with private key************************************************* Signature sig = Signature.getInstance("SHA1WithRSA"); sig.initsign (key.getPrivate ()); // sig 객체를 얻습니다. 개인 키를 얻습니다. // 서명 된 객체 원래 데이터를 얻습니다. Sig.update (plainText); // SIG 객체는 원래 데이터를 얻습니다 (실제로, 원래 데이터의 다이제스트가 사용되며, 소화가 나중에 디스크 밍이 될 수 없습니다. sig.sign (); // sig 객체는 개인 키를 사용하여 원래 데이터에 서명하고 서명 em.out.println (sig.getProvider (). getInfo ())에 서명 한 후 서명을받습니다. string 1 = new String (서명, "utf8"); system.out.println ( "/nsign with private key :"+after1); // public Key를 사용하여 sig.initVerify (key.getPublic (); // sig 객체가 원래 정보 sig.update (plaintext)를 가져옵니다. (sig.verify (signature)) {// SIG 객체는 대중 키로 서명을 해독하여 원래 데이터 (즉, 요약), true system.out.println ( "서명 검증이 정확합니다!" +new String ( "utf8");}} ( "Signature Verification !! {System.out.println ( "서명 확인 실패 !!");}5. 디지털 인증서
/***이 예제는 "디지털 인증서"파일에서의 작업입니다.* Java 플랫폼 (시스템에 JDK 설치)은 Keystore (인증서 라이브러리)를 제공합니다. KeyTool 명령은 CMD에서 인증서 라이브러리를 만들기 위해 제공됩니다. * *이 예제를 실행하기 전에 : * C 디스크 디렉토리에서 인증서를 작성하고, 인증서 라이브러리를 BocsoftKeylib로 지정하고, 별칭 테스트 인증으로 인증서를 만듭니다. * RSA 알고리즘을 사용하여 생성되고 키 길이는 1024이며 인증서는 1 년 동안 유효합니다. 수출 인증서 파일은 TC.C.이며 이미 로컬 디스크 C :/ *에 저장되어 있습니다. 인증서 파일 tc.cer expricatefactory cf = atricationfactory.getInstance ( "x.509"); fileInputStream in = new FileInputStream ( "c : /tc.cer"); // 파일 스트림 인증서 C = cf.generateCertificate (in) (in); "+c.tostring ());*// 위의 코드 메소드를 사용하지 않으면 위의 문자열 Pass ="Qazzaq "; FileInputStream in2 = new FileInputStream ("C :/BocsoftKeylib "); Keystore와 정확히 동일합니다. ks = keystore.getInstance ( "jks"); ks.load (in2, pass.tochararray ()); 문자열 alias = "testCertification"; // 별칭은 별칭 인증서 c = ks.getCertificate (alias); system.err.println ( "문자열로 변환 한 후 인증서 정보 :"+c.tostring ()); 이것은 인증서를 얻기위한 인증서 클래스의 서브 클래스이며, 더 많은 방법 x509Certificate t = (x509certificate) c; // 정보 시스템에서 필요한 정보를 추출합니다. 숫자 : "+t.getSerialNumber (). TOSTRING (16)); System.out.println ("제목 이름 ":"+T.getSubjectdn ()); System.out.println ( "발행자 :"+t.getissuerdn ()); System.out.println ( "yavility 기간 : "+t.getNotbefore ()); System.out.println ("서명 알고리즘 : "+t.getSigalGname ()); byte [] sig = t.getSignature (); // 서명 값 publickey pk = t.getPublickey (); byte [] pkenc = pk. getEncoded (); i = 0; i <pkenc.length; i ++) {system.out.print (pkenc [i]+",");} system.err.println (); // 인증서 날짜 유효성 검사, 발행 인증서는 유효한 날짜 간격이 있습니다. DATE! " cf.generatecertificate (in3)는 CA의 공개 키를 얻습니다 System.out.println ( "인증 날짜 유효성 확인 : 만료"); } catch (인증서 날짜 타당성 확인 : 만료 ");} catch (인증서의 날짜 유효성 확인 : 만료"); } catch (인증서의 날짜 유효성 검사 : 만료 ");} catch (filenotFoundException ce) {ce.printstacktrace ();} catch (filenotfoundException Fe) {fe.printstacktrace ();} /*Catch (ioException ioe) {} catch (keystoreException kse)}* /catch (예외. e) {e.printstacktrace ();}}요약
위의 모든 것은 Java 암호화 및 암호 해독 및 디지털 서명의 전체 코드 예제에 관한 것입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!