비대칭 비밀번호 개념
1. 대칭 암호화 알고리즘과의 주요 차이점은 암호화 및 암호 해독 키가 다르고, 하나는 공개 (공개 키)이고 다른 하나는 기밀 (개인 키)이라는 것입니다. 주로 대칭 암호화 알고리즘의 주요 할당 관리 문제를 해결하고 알고리즘 보안을 향상시킵니다.
2. 비대칭 암호화 알고리즘의 암호화 및 암호 해독 효율은 상대적으로 낮다. 알고리즘 설계에서 비대칭 암호화 알고리즘은 암호화 된 데이터의 길이에 대한 엄격한 요구 사항이 있습니다. 예를 들어, RSA 알고리즘은 암호화 될 데이터가 53 바이트를 초과하지 않아야합니다.
3. 비대칭 암호화 알고리즘은 주로 데이터 교환 대신 대칭 암호화 알고리즘의 키를 교환하는 데 사용됩니다.
4. Java6은 DH 및 RSA를 구현하는 두 가지 알고리즘을 제공합니다. 탄력 성은 e1gamal 알고리즘 지원을 제공합니다. 위의 세 가지 알고리즘 외에도 ECC 알고리즘도 있으며 현재 지원을 제공 할 관련 오픈 소스 구성 요소가 없습니다.
암호화 또는 암호 해독에는 두 개의 키가 필요하며 공용 및 개인 키로 나뉩니다.
특징 : 높은 안전성, 느린 속도
사용
Key Exchange (DH)】
공통 키를 결정하지 않고 두 당사자는 키를 생성하고 암호화 작업을 제공하지 않습니다. 암호화 및 암호 해독에는 다른 대칭 암호화 알고리즘이 필요합니다.
DH 알고리즘 예제
import javax.crypto.keyagreement; import javax.crypto.interfaces.dhprivatekey; import javax.crypto.interfaces.dhpublickey; import javax.crypto.spec.dhparameterspec; import java.security java.security.spec.x509encodedkeyspec; import java.util.hashmap; import java.util.map; // 1 소스 키를 생성하십시오. // 3 대상의 공개 키는 소스로 넘겨집니다. // 4 양 당사자는 상대방의 공개 키와 자체 개인 키를 사용하여 로컬 키를 생성합니다. 공개 정적 최종 문자열 private_key = "dh_private_key"; /** * 소스 키 쌍 생성 * @return * @throws Exception */public static map <string, object> initsourcey () 던지기 예외 {// 키패리 게이터 인스턴스 생성, dh 알고리즘 키 에이트 게이터 keypairgenerator = keypairgenerator.getinstance ( "dh"); // 키 길이, 기본 1024, 옵션 범위 512-65536 및 64 kyypairgenerator.initialize (1024); // 키 쌍 생성 KeyPair keypair = kyypairgenerator.generatekeypair (); dhpublickey dhpublickey = (dhpublickey) kyypair.getPublic (); dhprivatekey dhprivatekey = (dhprivatekey) kyypair.getPrivate (); // 키 쌍을 맵 맵에 넣습니다 <문자열, 개체> keymap = new Hashmap <String, object> (); keymap.put (public_key, dhpublickey); keymap.put (private_key, dhprivatekey); Keymap 리턴; } / ** * 소스 공개 키 * @param sourcepublickey * @return * @throws Exception * / public static map <string, object> inittargetKey (byte [] sourcepublickey)를 통해 대상 키 쌍을 생성합니다. // 소스 공개 키를 사용하고 KeysPec을 생성하고 KeyFactory를 사용하여 소스 공개 키 관련 정보를 생성합니다 x509EncodedKeyspec Keyspec = new x509EncodedKeyspec (SourcePublickey); dhpublickey sourcepublic = (dhpublickey) keyfactory.generatepublic (keyspec); dhparameterspec dhpublickeyparams = sourcepublic.getparams (); 키 이어 게이터 키패 게이터 = kyypairgenerator.getInstance ( "DH"); kyypairgenerator.initialize (dhpublickeyparams); Keypair kyypair = kyypairgenerator.generatekeypair (); dhpublickey dhpublickey = (dhpublickey) kyypair.getPublic (); dhprivatekey dhprivatekey = (dhprivatekey) kyypair.getPrivate (); // 키 쌍을 맵 맵에 넣습니다 <문자열, 개체> keymap = new Hashmap <String, object> (); keymap.put (public_key, dhpublickey); keymap.put (private_key, dhprivatekey); Keymap 리턴; } / *** 한 당사자의 공개 키와 다른 당사자의 개인 키를 사용하여 로컬 키* @return* / public static byte [] generatelocalsecretkey (byte [] apublickey, byte [] bprivatekey)를 생성합니다. 예외 {keyfactory keyfactory = keyfactory.getInstance ( "dh"); // 공개 키를 사용하고 KeysPec을 생성하고 KeyFactory를 사용하여 공개 키 관련 정보를 생성합니다 x509EncodedKeyspec Keyspec = new x509EncodedKeyspec (Apublickey); publickey publickey = keyfactory.generatepublic (keyspec); // B 개인 키를 사용하고 B Privatekey 관련 정보 생성 PKCS8ONCODEDKEYSPEC PKCS8ENCODEDKEYSPEC = NEW PKCS8ENCODEDKEYSPEC (BPRIVATEKEY); PrivateKey PrivateKey = keyfactory.generate -private (pkcs8encodedkeyspec); // keyagreement keyagreement keyagreement = keyagreement.getInstance ( "dh")를 통해 A의 publickey와 b의 개인 키를 암호화합니다. keyagreement.init (privatekey); keyagreement.dophase (publickey, true); return keyAgreement.generatesEcret ( "aes"). getencoded (); // 알고리즘은 대칭 암호화 알고리즘 (des, desede, aes)을 사용합니다. // 알고리즘은 알고리즘을 선택하지 않고 기본 메소드를 사용하여 계산하는 데 사용될 수 있습니다} // 공개 키 바이트 배열 공개 정적 바이트 [] getPublicKey (map <string, object> map) {return ((dhpublickey) map.get (public_key)). getencoded (); } // 개인 키 바이트 배열 공개 정적 바이트 [] getPrivatekey (map <String, Object> Map) {return ((DhprivateKey) map.get (private_key)). getEncoded (); } public static void main (string [] args)은 예외 {byte [] source_public_key; 바이트 [] source_private_key; 바이트 [] source_local_key; 바이트 [] target_public_key; 바이트 [] target_private_key; 바이트 [] target_local_key; map <string, object> sourcekey = initsourcekey (); source_public_key = getpublickey (sourcekey); source_private_key = getPrivateKey (SourceKey); System.out.println ( "소스 공개 키 :"+bytestoHex.FromByTestoHex (source_public_key)); System.out.println ( "소스 개인 키 :"+bytestoHex.frombyTestoHex (source_private_key)); map <string, object> targetkey = inittargetKey (getPublicKey (SourceKey)); target_public_key = getPublickey (TargetKey); target_private_key = getPrivateKey (TargetKey); System.out.println ( "Target Public Key :"+BytestoHex.FromByTestoHex (Target_Public_Key)); System.out.println ( "대상 개인 키 :"+bytestoHex.FromByTestoHex (Target_Private_key)); source_local_key = generatelocalsecretkey (target_public_key, source_private_key); Target_local_key = GenerateloCalsEcretkey (source_public_key, target_private_key); System.out.println ( "소스 로컬 키 :"+bytestohex.frombyTestoHex (source_local_key)); System.out.println ( "Target Local Key :"+bytestoHex.FromByTestoHex (Target_local_key)); }}【암호화/암호 해독 (RSA) 】【 디지털 서명 (RSA)】
RSA 알고리즘은 DH 알고리즘보다 늦고이 다섯 글자는 모두 인간 이름의 첫 번째 문자입니다. DH 알고리즘은 최초의 비대칭 암호화 시스템입니다.
RSA 알고리즘은 컴퓨팅 속도가 느리며 많은 양의 데이터를 암호화하는 데 적합하지 않습니다. 한 가지 솔루션은 RSA와 대칭 암호화 방법을 혼합하고 대칭 암호화 방법을 사용하여 데이터를 암호화하고 대칭 암호화 키는 RSA 알고리즘을 사용하여 암호화됩니다. 열쇠가 매우 짧기 때문에 시간은 그리 많지 않습니다. 실제로, 대칭 암호화 방법의 유일한 단점은 키를 통과하기가 어렵고 대칭 암호화 방법도 깨지기 어렵다는 것입니다.
RSA의 적용 가능한 시나리오 :
(1) 서버는 공개 키와 개인 키를 생성하고 공개 키를 홍보합니다.
(2) 클라이언트는 공개 키를 사용하여 데이터를 암호화하여 서버로 넘겨줍니다. 다른 사람들은 암호화 된 데이터를 이해할 수 없습니다.
(3) 서버는 개인 키를 사용하여 데이터를 해독하고 사용자가 제출 한 데이터를 봅니다.
이 경우 공개 키는 사서함과 같으며 모든 사람 이이 사서함에 메시지를 넣을 수 있지만 사서함 키가있는 사람만이 사서함에서 문자를 볼 수 있습니다.
RSA 해당 시나리오 2 :
(1) 황제는 공개 키와 비밀 키를 생성하고 공개 키를 홍보합니다.
(2) 황제는 세상에 알리기 위해 칙령을 발표했다. 칙령의 오른쪽 하단에 두 개의 숫자가 있습니다. 첫 번째 문자열은 임의의 문자열이고 두 번째 문자열은 개인 키로 첫 번째 문자열을 암호화 한 결과입니다.
(3) 어떤 사람들은 칙령이 황제에 의해 작성되었다고 믿지 않으므로 공개 키를 사용하여 두 번째 숫자를 해독했습니다. 해독 후, 그들은 그것이 첫 번째 숫자 문자열과 동일하다는 것을 발견했으며, 이는 그것이 실제로 황제에 의해 작성되었음을 의미합니다. 대부분의 사람들은 키가 없기 때문에 공개 키로 해독 할 수있는 데이터를 암호화 할 수 없습니다.
이 경우 공개 키는 암호 해독에 사용되며 개인 키는 암호화에 사용됩니다. 이것은 발표가 실제로 누군가가 발송되었음을 증명하는 데 사용될 수 있습니다. 서명과 동일합니다.
실제로, 서명에 특히 오래 갈 필요가 없습니다. 일반적으로 서명은 고정 길이입니다. 고정 길이를 원한다면 MD5 및 SHA 시리즈와 같은 MessageDigest 알고리즘을 사용할 수 있습니다. 따라서 MD5 Withrsa 등과 같은 다양한 서명 알고리즘이 있습니다.
RSA 암호화/암호 해독 예
import javax.crypto.cipher; import java.security.keypair; import java.security.keypairgenerator; import java.security.publickey; import java.security.interfaces.rsaprivatekey; import java.security.interfaces.rsapublickey; java.util.hashmap; java.util.map;/*** RSA 암호화 도구*/public class rsautil {public static final String public_key = "rsa_public_key"; 공개 정적 최종 문자열 private_key = "rsa_private_key"; / ** * 초기화 키 * @return * @throws Exception */ public static map <string, object> initkey ()는 예외 {kyypairgenerator kyypairgenerator = kyypairgenerator.getinstance ( "rsa"); kyypairgenerator.initialize (1024); // 512-65536 & 64 Kyypair kyypair = kyypairgenerator.generatekeypair (); rsapublickey publickey = (rsapublickey) kyypair.getPublic (); rsaprivatekey privatekey = (rsaprivatekey) kyypair.getPrivate (); Map <String, Object> keymap = new Hashmap <String, Object> (); keymap.put (public_key, publickey); keymap.put (private_key, privatekey); Keymap 리턴; } public static rsapublickey getPublickey (map <string, object> keymap) {return (rsapublickey) keymap.get (public_key); } public static rsaprivatekey getPrivatekey (map <string, object> keymap) {return (rsaprivatekey) keymap.get (private_key); } / ** * 공개 키를 사용하여 데이터 암호화 * @param data * @param publickey * @return * @throws 예외 * / public static byte [] encrypt (byte [] data, rsapublickey publickey) 예외 {cipher cipher = cipher.getInstance ( "rsa"); cipher.init (cipher.encrypt_mode, publickey); 반환 cipher.dofinal (데이터); } / ** * 개인 키를 사용하여 해독 * @param data * @param privatekey * @return * @throws 예외 * / public static byte [] decrypt (byte [] data, rsaprivatekey) 예외 {cipher cipher = cipher.getinstance ( "rsa"); cipher.init (cipher.decrypt_mode, privatekey); 반환 cipher.dofinal (데이터); } public static void main (string [] args)은 예외 {String data = "jay chou-dongfeng break"; map <string, object> keymap = initkey (); 바이트 [] miwen = alcrypt (data.getBytes (), getPublickey (keyp)); System.out.println ( "암호화 된 내용 :"+bytestoHex.FromByTestoHex (Miwen)); 바이트 [] plain = decrypt (miwen, getprivatekey (keyp)); System.out.println ( "암호 해독 된 내용 :"+new String (plain)); }}위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.