암호화는 특수 알고리즘을 사용하여 원래 정보 데이터를 변경하여 무단 사용자가 암호화 된 정보를 얻더라도 암호 해독 방법을 알지 못하기 때문에 정보의 내용을 여전히 이해할 수 없도록하는 것입니다. 이는 일반적으로 양방향 암호화 및 일원 암호화로 나뉘어지는 반면, 양방향 암호화는 대칭 암호화 및 비대칭 암호화로 나뉩니다 (일부 재료는 암호화를 대칭 암호화 및 비대칭 암호화로 직접 나눕니다).
양방향 암호화의 일반적인 의미는 일반 텍스트 암호화 후 암호 텍스트를 형성하는 것입니다. 이는 알고리즘을 통해 일반 텍스트로 복원 할 수 있습니다. 일원 암호화는 정보에 대한 다이제스트 계산 만 수행하며 알고리즘을 통해 일반 텍스트를 생성 할 수 없습니다. 엄격히 말하면, 일원 암호화는 암호화 유형으로 간주 될 수 없지만 다이제스트 알고리즘으로 간주되어야합니다.
구체적으로:
시스템을 사용할 수 있어야하며 비대적으로 해독 할 수 없습니다.
시스템은 기밀로 유지할 필요가 없으며 적의 손에 쉽게 빠질 수 있습니다.
열쇠는 글을 쓰지 않고 교환하고 암기해야하며 양 당사자는 키를 변경할 수 있습니다.
이 시스템은 통신에 사용될 수 있습니다.
시스템은 위치를 전송할 수 있으며 여러 사람을 통과하지 않고도 기능을 달성해야합니다.
이 시스템은 사용하기 쉽고 사용자가 과로하거나 많은 규칙을 가질 필요가 없습니다.
1. 기본 암호화 방법 코드 제공 업체
JDK : 코드는 Java 설치 디렉토리의 JRE/LIB/JCE.JAR 패키지에 있습니다.
CC : org.apache.commons.codec Apache에서 제공합니다
홈페이지 : http://commons.apache.org/proper/commons-codec/
BC : org.bouncecastle
홈페이지 : http://www.bouncycastle.org/java.html
기본적으로 일반적으로 사용되는 JDK로는 충분합니다.
2. Base64 알고리즘
1. 암호화 알고리즘의 복잡성으로 판단하면 Base64는 암호화되었다고 말하지만 컴퓨터를 전혀 이해하지 못하는 사람들에게는 충분합니다. Base64 인코딩은 읽을 수 없습니다. 즉, 인코딩 된 데이터는 육안으로 인간이 직접 보이지 않습니다.
Base64 인코딩은 일반적으로 URL 프로세싱에 사용되거나 평범한 사람들이 한 눈에 알기를 원하지 않는 것은 Base64 인코딩으로 처리 한 다음 인터넷에 게시 할 수 있습니다.
package com.amuro.strategy.base64; import java.util.base64; import com.amuro.strategy.istrategy;/** * base64 알고리즘은 64 개의 기본 문자를 기반으로하며,이 64 개의 문자 만 암호화 된 문자열 * @author amuro * */public class64 strate (probloggy emprode istrateggy empord istrateggy empord)에 포함됩니다. 바이트 [] encodeBytes = base64.getEncoder (). encode (src.getBytes ()); 새 문자열을 반환합니다 (EncodeBytes); } public string decode (String src) {byte [] decodebytes = base64.getDecoder (). decode (src.getBytes ()); 새 문자열 (decodebytes)을 반환합니다. }}2. Base64 인코딩 서신 테이블
3. 메시지 다이제스트 알고리즘 (메시지 다이제스트)
메시지 다이제스트를 디지털 다이제스트라고도합니다. 메시지 또는 텍스트의 고정 길이에 해당하는 고유 한 값이며 메시지에 작용하는 일원 해시 암호화 기능에 의해 생성됩니다. 해시 함수의 충돌 저항으로 인해 단락의 한 글자 만 변경 되더라도 해시 알고리즘 후에 다른 값이 생성됩니다. 해시 알고리즘의 단방향성으로 인해 해시 값이 계산적으로 동일한 두 개의 다른 입력 메시지를 찾을 수 없습니다. 따라서 데이터의 해시 값, 즉 메시지 다이제스트는 데이터의 무결성을 확인할 수 있습니다.
평범한 말로, 모든 데이터는 인간처럼 독특해야합니다. 고유 식별자는 무엇입니까? 인간에게는 현재 지문이며 데이터의 지문은 무엇입니까? 맞습니다. 메시지 다이제스트 알고리즘에 의해 생성 된이 문자열입니다. 예를 들어, 웹 사이트를 등록하면 클라이언트가 서버로 입력 한 비밀번호를 전송합니다. 이는 메시지 다이제스트 처리 후 콘텐츠가되어야합니다. 서버가 고장 났더라도 Hack은 사용자의 실제 비밀번호가 무엇인지 알 수 없습니다. 그러나 MD5와 SHA가 현재 손상되었으므로 Google을 구매할 수 있습니다.
1. MD5
package com.amuro.strategy.message_digest; import java.security.messagegegest; import java.security.nosuchalgorithmonscepce md5strategy는 istrategy {public string encode (String Src) {try {messageDigest md = messageDigest.getInstance ( "md5"); 바이트 [] encodeBytes = md.digest (src.getBytes ()); return hex.encodeHexString (EncodeBytes); } catch (nosuchalgorithmexception e) {e.printstacktrace (); } return null; } public string decode (String src) {strach new runtimeexception ( "md5 no decode"); }}2. Sha
package com.amuro.strategy.message_digest; import java.security.messagegegest; import java.security.nosuchalgorithmonsception; import org.apache.commons.codec.binary.hex; import com.amuro.strategy.istegy; secect classm * @author amgorith * @author amborith * @author amgorith * @author amgorith * @author amgority * @autho Shastrategy는 istrategy {public string encode (String SRC) {try {messageDigest Md = MessageDigest.getInstance ( "sha"); md.update (src.getBytes ()); return hex.encodeHexString (md.digest ()); } catch (nosuchalgorithmexception e) {e.printstacktrace (); } return null; } public string decode (String src) {strach new runtimeexception ( "sha no decode"); }} 4. 대칭 암호화 <br /> 단일 키 암호화 시스템의 암호화 방법을 사용하여 동일한 키를 동시에 암호화 및 암호 해독으로 사용할 수 있습니다. 이 암호화 방법을 대칭 암호화라고하며 단일 키 암호화라고도합니다. 암호화와 암호 해독 모두 동일한 키를 사용하므로 키를 안전하게 통과시키는 방법은 해독자에게 문제가됩니다. 해결해야 할 문제가됩니다. 물론 보안이 낮은 장점은 적은 계산량, 빠른 암호화 속도 및 높은 암호화 효율입니다.
그러나 현대 컴퓨터는 오랫동안 이러한 수준의 컴퓨팅에 대한 관심을 중단했으며 안전이 가장 중요한 것입니다.
1. des
전체 이름은 "데이터 암호화 표준"이고 중국어 이름은 "데이터 암호화 표준"이며 주요 암호화를 사용하는 블록 알고리즘입니다. DES 알고리즘은 암호화 시스템의 대칭 암호화 시스템으로 미국 데이터 암호화 표준이라고도합니다. 1972 년 미국에서 IBM이 개발 한 대칭 암호화 시스템 암호화 알고리즘입니다. 일반 텍스트는 64 비트로 그룹화되며, 실제로 열쇠는 DES 작동에 참여하는 56 비트 암호화 방법입니다 (8, 16, 24, 32, 48, 56, 64 비트는 각각의 키가 홀수 키를 갖습니다. 암호 텍스트 그룹의 암호화 방법을 형성하기 위해 비트 대체 또는 교환.
package com.amuro.strategy.des; import javax.crypto.cipher; import javax.crypto.keygenerator; import javax.crypto.secretkey; import javax.crypto.secretkeyfactory; import javax.crypto.spec.deskeyspec; import org.codec.bine.binal com.amuro.strategy.istrategy;/** * * @author amuro * */public class desstrategy emplements istrategy {private cipher cipher; 개인 비밀 발전기; public String encode (String SRC) {try {keygenerator keygenerator = keygenerator.getInstance ( "des"); KeyGenerator.init (56); // 크기 SecretKey SecretKey = keyGenerator.generatekey (); 바이트 [] keybytes = secretkey.getencoded (); Deskeyspec Deskeyspec = 새로운 Deskeyspec (keybytes); SecretKeyFactory SecretKeyFactory = SecretKeyFactory.getInstance ( "Des"); GenerateKey = SecretKeyFactory.generatesEcret (Deskeyspec); cipher = cipher.getinstance ( "des/ecb/pkcs5padding"); cipher.init (cipher.encrypt_mode, generatekey); 바이트 [] resultBytes = cipher.dofinal (src.getBytes ()); return hex.encodeHexString (resultBytes); } catch (예외 e) {e.printstacktrace (); } return null; } public string decode (String src) {try {cipher.init (cipher.decrypt_mode, generatekey); 바이트 [] result = hex.decodehex (src.tochararray ()); 새 문자열을 반환합니다 (cipher.dofinal (결과)); } catch (예외 e) {e.printstacktrace (); } return null; }}"트리플 데스"라고도하는 3des3des를 "트리플 데이터 암호화 알고리즘"이라고하며, 이는 DES 암호화 알고리즘을 각 데이터 블록에 세 번 적용하는 것과 같습니다. 향상된 컴퓨터 컴퓨팅 성능으로 인해 원래 DES 비밀번호의 핵심 길이는 쉽게 무차별대로가되었습니다. 3DES는 새로운 블록 암호 알고리즘을 설계하는 대신 DES의 키 길이를 증가시켜 유사한 공격을 피하기 위해 비교적 간단한 방법을 제공하도록 설계되었습니다.
package com.amuro.strategy.des; import javax.crypto.cipher; import javax.crypto.keygenerator; import javax.crypto.secretkey; import javax.crypto.secretkeyfactory; import javax.crypto.spec.desedekeyspec; import org.codec.binal com.amuro.strategy.istrategy; public class _3desstrategy emplements istrategy {private cipher cipher; 개인 비밀 발전기; public String encode (String SRC) {try {keygenerator keygenerator = keygenerator.getInstance ( "Desede"); KeyGenerator.init (168); // 크기 SecretKey SecretKey = keyGenerator.generatekey (); 바이트 [] keybytes = secretkey.getencoded (); Desedekeyspec Deskeyspec = New Desedekeyspec (keybytes); SecretKeyFactory SecretKeyFactory = SecretKeyFactory.getInstance ( "Desede"); GenerateKey = SecretKeyFactory.generatesEcret (Deskeyspec); cipher = cipher.getinstance ( "Desede/ecb/pkcs5padding"); cipher.init (cipher.encrypt_mode, generatekey); 바이트 [] resultBytes = cipher.dofinal (src.getBytes ()); return hex.encodeHexString (resultBytes); } catch (예외 e) {e.printstacktrace (); } return null; } public string decode (String src) {try {cipher.init (cipher.decrypt_mode, generatekey); 바이트 [] result = hex.decodehex (src.tochararray ()); 새 문자열을 반환합니다 (cipher.dofinal (결과)); } catch (예외 e) {e.printstacktrace (); } return null; }}3. Aesaes, 전체 이름은 "고급 암호화 표준"이고 중국 이름은 "고급 암호화 표준"입니다. 암호화에서 Rijndael 암호화 방법이라고도합니다. 미국 연방 정부가 채택한 블록 암호화 표준입니다. 새로운 세대의 데이터 암호화 표준으로서 AES 암호화 알고리즘은 강력한 보안, 고성능, 고효율, 사용 편의성 및 유연성의 장점을 모았습니다. AES 디자인에는 128, 192, 256 비트의 세 가지 키 길이가 있습니다. 비교적 말하면, 128 AES의 키는 56 Des의 키보다 1021 배 더 강합니다.
package com.amuro.strategy.des; import javax.crypto.cipher; import javax.crypto.keygenerator; import javax.crypto.secretkey; import javax.crypto.spec.secretkeyspec; import org.apache.commons.codec.binary.hex aestrategy는 istrategy {개인 암호 암호; 개인 비밀 발전기; public String encode (String SRC) {try {keygenerator keygenerator = keygenerator.getInstance ( "aes"); KeyGenerator.init (128); // 크기 SecretKey SecretKey = KeyGenerator.generateKey (); 바이트 [] keybytes = secretkey.getencoded (); GenerateKey = 새로운 SecretKeyspec (KeyBytes, "AES"); cipher = cipher.getinstance ( "AES/ECB/PKCS5PADDING"); cipher.init (cipher.encrypt_mode, generatekey); 바이트 [] resultBytes = cipher.dofinal (src.getBytes ()); return hex.encodeHexString (resultBytes); } catch (예외 e) {e.printstacktrace (); } return null; } public string decode (String src) {try {cipher.init (cipher.decrypt_mode, generatekey); 바이트 [] result = hex.decodehex (src.tochararray ()); 새 문자열을 반환합니다 (cipher.dofinal (결과)); } catch (예외 e) {e.printstacktrace (); } return null; }} 4. PBE
PBE, 성명 "비밀번호베이스 암호화"는 비밀번호 기반 암호화 알고리즘입니다. 특성은 키 대신 암호가 사용되며 비밀번호는 사용자 직접 관리한다는 것입니다. 임의 번호는 데이터의 보안을 보장하기 위해 여러 암호화 및 기타 방법을 해시했습니다.
PBE 알고리즘에는 키의 개념이 없으며 암호를 키로 취급합니다. 키의 길이는 알고리즘의 보안에 영향을 미치고 메모리에 편리하지 않기 때문에 여기에서 사용하는 비밀번호를 직접 사용하는 것이 매우 다릅니다. 이는 메모리에 편리합니다. 그러나 간단한 암호는 사전 방법으로 쉽게 소진되므로 여기서 암호에 "소금"을 추가했습니다. 이 소금과 암호의 조합은 금이 가기가 어렵습니다. 동시에, 우리는 소금과 비밀번호를 병합하고 메시지 다이제스트 알고리즘으로 여러 번 반복하여 주요 초기화 벡터의 기본 자료를 구축하여 해독을 더욱 어렵게 만듭니다.
package com.amuro.strategy.pbe; import java.security.securerandom; import javax.crypto.cipher; import javax.crypto.secretkey; import javax.crypto.secretkey; import javax.crypto.secretkeyfactory javax.crypto.spec.peyspec javax.crypto.spec.pbeparameterspec; import org.apache.commons.codec.binary.hex; import com.amuro.strategy.istrategy;/** * 암호 기반 암호화 (암호), 대칭 + 메시지 digest * @author amuro */public classe pbestrategy empher isttrateggy em isttrateggy em; 개인 비밀 발전기; 개인 PBEPARAMETERSPEC PBEPARAMETERSPEC; public string encode (String Src) {try {Securerandom Securerandom = new Securerandom (); 바이트 [] salt = securerandom.generateseed (8); 문자열 암호 = "Amuro"; pbekeyspec pbekeyspec = new pbekeyspec (password.tochararray ()); SecretKeyFactory SecretKeyFactory = SecretKeyFactory.getInstance ( "PBEWITHMD5andDES"); generatekey = secretKeyFactory.generatesEcret (Pbekeyspec); pbeparameterspec = 새로운 pbepparameterspec (Salt, 100); cipher = cipher.getinstance ( "pbewithmd5anddes"); cipher.init (cipher.encrypt_mode, generatekey, pbeparameterspec); 바이트 [] resultBytes = cipher.dofinal (src.getBytes ()); return hex.encodeHexString (resultBytes); } catch (예외 e) {e.printstacktrace (); } return null; } public string decode (String src) {try {cipher.init (cipher.decrypt_mode, generatekey, pbeparameterspec); 바이트 [] result = hex.decodehex (src.tochararray ()); 새 문자열을 반환합니다 (cipher.dofinal (결과)); } catch (예외 e) {e.printstacktrace (); } return null; }} 5. 비대칭 암호화 <br /> 비대칭 암호화 알고리즘에는 두 가지 키, 즉 공개 키와 개인 키를 암호화하고 해독하려면 두 개의 키가 필요합니다. 주목할만한 점은 공개 키와 개인 키가 쌍이어야한다는 것입니다. 데이터가 공개 키로 암호화되면 해당 개인 키 만 해독 할 수 있으며 그 반대도 마찬가지입니다. 암호화와 암호 해독은 두 가지 다른 키를 사용하기 때문에이 알고리즘을 비대칭 암호화 알고리즘이라고합니다.
1. RSA
실제로 RSA는 1978 년 초에 나타 났으며 데이터 암호화와 디지털 서명 모두에 사용할 수있는 최초의 알고리즘이었습니다. 이해하고 운영하기 쉽고 매우 인기가 있습니다. 원칙은 위의 작업 과정에서 설명 된대로입니다. RSA 알고리즘은 매우 간단한 숫자 이론 사실을 기반으로합니다. 두 개의 큰 소수를 쉽게 곱하기 쉽지만 제품을 고려하는 것은 매우 어렵 기 때문에 제품을 암호화 키로 공개 할 수 있습니다.
package com.amuro.strategy.asymmetric; import java.security.keyfactory; import java.security.keypair; import java.security.keypairgenerator; import java.security.privatekey; import java.security.publickey; import java.security.rinterfaces.rsaprivekey; java.security.interfaces.rsapublickey; import java.security.spec.pkcs8encodedkeyspec; import java.security.spec.x509encodedkeyspec; import javax.crypto.cipher.cipher; import org.apache.commons.binarory.hinarinary 클래스 rsastrategy는 istrategy {private rsapublickey rsapublickey; 개인 rsaprivatekey rsaprivatekey; public string encode (String SRC) {try {// 키 키어 게이터 keypairgenerator = kyypairgenerator.getInstance ( "rsa"); kyypairgenerator.initialize (512); Keypair kyypair = kyypairgenerator.generatekeypair (); rsapublickey = (rsapublickey) kyypair.getPublic (); rsaprivatekey = (rsaprivatekey) kyypair.getPrivate (); // 개인 키 암호화 공개 키 암호 해독 PKCS8ENCODEDKEYSPEC PKCS8ENCODEDKEYSPEC = NEW PKCS8ENCODEDKEYSPEC (RSAPRIVATEKEY.GETENCODED ()); keyfactory keyfactory = keyfactory.getInstance ( "rsa"); PrivateKey PrivateKey = keyfactory.generate -private (pkcs8encodedkeyspec); Cipher Cipher = cipher.getinstance ( "rsa"); cipher.init (cipher.encrypt_mode, privatekey); 바이트 [] resultBytes = cipher.dofinal (src.getBytes ()); // 비공개 키 암호화 공개 키 암호화 // x509EncodedKeyspec x509EncodedKeyspec = // new x509EncodedKeyspec (rsapublickey.getEncoded ()); // keyfactory keyfactory = keyctory.getInstance ( "rsa"); // publickey = keyfactory.generatepublic (x509encodedKeyspec); // cipher cipher = cipher.getInstance ( "rsa"); // cipher.init (cipher.encrypt_mode, publickey); // byte [] resultbytes = cipher.dofinal (src.getBytes ()); return hex.encodeHexString (resultBytes); } catch (예외 e) {e.printstacktrace (); } return null; } public string decode (String SRC) {try {// private key 암호화 public Key Myryption X509ENCODEDKEYSPEC X509ENCODEDKEYSPEC = new X509EncodedKeyspec (rsapublickey.getEncoded ()); keyfactory keyfactory = keyfactory.getInstance ( "rsa"); publickey publickey = keyfactory.generatepublic (x509encodedkeyspec); Cipher Cipher = cipher.getinstance ( "rsa"); cipher.init (cipher.decrypt_mode, publickey); 바이트 [] resultBytes = cipher.dofinal (hex.decodehex (src.tochararray ())); // 비공개 키 암호화 공개 키 암호화 // pkcs8encodedkeyspec pkcs8encodedkeyspec // = new pkcs8encodedkeyspec (rsaprivatekey.getencoded ()); // keyfortory keyfactory = key actorory.getinstance (// privatekey key = // privatekey =); keyfactory.generate -private (pkcs8encodedKeyspec); // cipher cipher = cipher.getInstance ( "rsa"); // cipher.init (cipher.decrypt_mode, privatekey); // byte [] resultBytes = cipher.dofinal (Hex.decodeHex); 새 문자열을 반환합니다 (resultBytes); } catch (예외 e) {e.printstacktrace (); } return null; }} 2. DH 알고리즘
전체 이름 "Diffie-Hellman"인 DH는 공유 키가 안전하지 않은 네트워크를 안전하게 건너는 방법으로, 종종 주요 컨센서스 프로토콜이라고합니다. 공개 키 암호화 시스템의 창시자 인 Diffie와 Hellman이 제안한 아이디어. 간단히 말해서, 두 사용자가 공개 미디어에서 정보를 교환하여 "일관성"및 공유 가능한 키를 생성 할 수 있습니다. 즉, Party A는 한 쌍의 키 (공개 키, 개인 키)를 생성하고 Party B는 Party A의 공개 키를 기반으로 Party B의 키 쌍 (Public Key, Private Key)을 생성합니다.
이를 데이터 전송 기밀성의 기초로 기준으로 취하면 양 당사자는 동일한 대칭 암호화 알고리즘을 사용하여 로컬 키 (Secretkey)를 구축하여 데이터를 암호화합니다. 이러한 방식으로 로컬 키 (Secretkey) 알고리즘이 상호 운용 가능한 후, 당사자 A와 당사자 B는 공개 키를 공개하고, 방금 생성 된 상대방의 공개 키와 개인 키를 사용하여 데이터를 암호화하고 동시에 상대방의 공개 키와 개인 키를 사용하여 데이터를 해독 할 수 있습니다. 두 당사자 A와 B뿐만 아니라 Multi-Party Shared Data Communication으로 확장되어 네트워크 대화식 데이터의 안전한 통신을 완료합니다!
package com.amuro.strategy.asymmetric; import java.security.keyfactory; import java.security.keypair; import java.security.keypairgenerator; import java.security.privatekey; import java.security.publickey; import java.security.spec.x509 EMOCODYSPEC; java.util.objects; import javax.crypto.cipher; import javax.crypto.keyagreement; import javax.crypto.secretkey; import javax.crypto.interfaces.dhpublickey; import javax.crypto.spec.dhparameterspec; import org.apache.commons.codec.binary.hex; import com.amuro.strategy.istrategy; public class dhstrategy emplements istrategy {private cipher cipher; 개인 비밀 리시버 시트 키; public string encode (String SRC) {try {// 초기화 키 키어 게이터 SenderKeyPairGenerator = kyypairgenerator.getInstance ( "DH"); SenderKeyPairGenerator.initialize (512); Keypair senderkeypair = senderkeypairgenerator.generatekeypair (); privatekey senderPrivateKey = senderKeyPair.getPrivate (); byte [] senderpublickeyBytes = senderKeypair.getPublic (). getencoded (); // sender의 공개 키 // 수신기의 키 초기화, 발신자의 공개 키 KeyFactory cheeiverKeyCfactory = keyfactory.getInstance ( "DH")를 사용하십시오. X509ENCODEDKEYSPEC X509ENCODEDKEYSPEC = NEW X509ENCODEDKEYSPEC (SenderPublickeyBytes); publickey receiverpublickey = receiverkeyfactory.generatepublic (x509encodedkeyspec); DHPARAMETERSPEC DHPARAMETERSPEC = ((DHPUBLICKEY) receiverPublicKey) .getParams (); KeyPairGenerator receiverKeyPairGenerator = KeyPairGenerator.getInstance ( "DH"); receiverkeypairgenerator.initialize (dhparameterspec); Keypair receiverkeypair = receiverkeypairgenerator.generatekeypair (); privatekey receiverPrivateKey = receiverKeyPair.getPrivate (); BYTE [] 수신자 publickeyBytes = receiverKeyPair.getPublic (). getencoded (); keyagreement receiverkeyAgreement = keyagreement.getInstance ( "dh"); receiverkeyAgreement.init (receiverPrivateKey); receiverkeyAgreement.dophase (수신자 publickey, true); 수신자 eCRETKEY = 수신기 keyAgreement.generatesEcret ( "des"); // 발신자는 수신자의 공개 키를 가져 와서 암호화 할 수 있습니다. keyfactory senderKeyFactory = keyFactory.getInstance ( "DH"); X509EncodedKeyspec = 새로운 x509EncodedKeyspec (수신기 publickeyBytes); publickey senderpublickey = senderKeyFactory.generatePublic (x509encodedKeyspec); keyagreement senderkeyAgreement = keyagreement.getInstance ( "dh"); senderkeyAgreement.init (senderPrivateKey); SenderKeyAgreement.Dophase (SenderPublickey, True); Secretkey sendersecretkey = SenderKeyAgreement.generatesEcret ( "des"); if (objects.equals (수신기 recretkey, senderseCretkey)) {cipher = cipher.getInstance ( "des"); cipher.init (cipher.encrypt_mode, sendersecretkey); 바이트 [] result = cipher.dofinal (src.getBytes ()); 반환 hex.encodeHexString (결과); }} catch (예외 e) {e.printstacktrace (); } return null; } public string decode (String src) {try {cipher.init (cipher.decrypt_mode, receversecretkey); 바이트 [] result = hex.decodehex (src.tochararray ()); 새 문자열을 반환합니다 (cipher.dofinal (결과)); } catch (예외 e) {e.printstacktrace (); } return null; }} 6. 디지털 서명 인증서의 비대칭 암호화는 이미 매우 안전하지만 또 다른 결함이 있습니다.
서버 A 공개 키가 게시되었습니다. 내 컴퓨터는 서버 A의 공개 키로 데이터를 암호화 한 다음 서버 A로 보냈습니다. 현재 서버 B는 내 컴퓨터를 침입하여 공개 키로 사용한 공개 키를 대체하여 보낸 데이터가 서버 B의 개인 키에 의해 갈라집니다. 공개 키가 변조되는 것을 방지하는 방법은 무엇입니까?
예, 우리는 이전 메시지 요약을 생각했습니다. 서버 A가 나에게 공개 키를 던 졌을 때, 그는 또한 디지털 인증서를 신청하기 위해 CA에 갔다. 실제로, 그것은 주로 공개 키의 메시지 요약입니다. 이 인증서를 사용하면 공개 키로 암호화 할 때 먼저 서버 A에 의해 현재 공개 키가 나에게 전송되는지 확인했는지 확인할 수 있습니다.
다음은 일종의 RSA입니다.
패키지 com.amuro.strategy.signature; import java.security.keyfactory; import java.security.keypair; import java.security.keypairgenerator; import java.security.privatekey; import java.security.publickey; import java.security.security; signature; 수입; java.security.interfaces.rsaprivatekey; import java.security.interfaces.rsapublickey; import java.security.spec.pkcs8encodedkeyspec; import java.security.spec.x509EncodedKeyspec; public class rsasign {public static boolean voolean voolean voolean verifys { 키 이어 게이터 키패 게이터 = kyypairgenerator.getInstance ( "RSA"); kyypairgenerator.initialize (512); Keypair kyypair = kyypairgenerator.generatekeypair (); publickey rsapublickey = (rsapublickey) kyypair.getPublic (); privatekey rsaprivatekey = (rsaprivatekey) kyypair.getPrivate (); pkcs8encodedkeyspec pkcs8encodedkeyspec = new pkcs8encodedKeyspec (rsaprivatekey.getEncoded ()); keyfactory keyfactory = keyfactory.getInstance ( "rsa"); PrivateKey PrivateKey = keyfactory.generate -private (pkcs8encodedkeyspec); Signature Signature = Signature.getInstance ( "Md5withrsa"); Signature.initsign (privatekey); signature.update (src.getBytes ()); // 시그니처 바이트 바이트 바이트 바이트 생성 [] signbytes = signature.sign (); X509ENCODEDKEYSPEC X509ENCODEDKEYSPEC = NEW X509ENCODEDKEYSPEC (rsapublickey.getEncoded ()); keyfactory = keyfactory.getInstance ( "rsa"); publickey publickey = keyfactory.generatepublic (x509encodedkeyspec); Signature = Signature.getInstance ( "Md5withrsa"); signature.initverify (publickey); signature.update (src.getBytes ()); 부울 위조 = 서명. 반환 위조; } catch (예외 e) {e.printstacktrace (); } false를 반환합니다. }} 디지털 시그니처 및 비대칭 암호화 알고리즘의 사용과 관련하여 훌륭한 예를 보았습니다.
아아, 나는 이번 달에 너무 많은 책을 샀고 그 달 말까지 책을 꺼낼 수 없습니다. 나는 QQ에서 Clark를 만나게되었다 :
1-2-3 : "클라크, 200 타 엘 실버가 필요해, 나에게 빌려 주시겠습니까?"
클라크 : "문제 없어. 지금 돈을 옮길 게요. 제발 IoU를주세요."
1-2-3 : "정말 감사합니다. IOU를 당신에게 쓸 것입니다."
그런 다음 새 Word 문서를 만들고 IOU를 작성하고 저장했습니다. 그럼 어떻게해야하나요? 이유는 Clark에 직접 IOU를 보낼 수 없습니다.
1. 나는 Clark이 IOU를받은 후 "200 태 태울"은 "2000 년의은"으로 바뀌지 않을 것이라고 보장 할 수 없습니다.
2. 부채를 놓치면 클라크는 내가 IOU를 썼다는 것을 증명할 수 없습니다.
3. 일반적인 단어 문서는 소송의 증거로 사용될 수 없습니다.
다행히도 디지털 인증서를 신청했습니다. 먼저 개인 키로 IOU를 암호화 한 다음 암호화 된 암호 텍스트를 QQ의 Clark로 보냅니다. Clark이 IOU의 암호 텍스트를받은 후, 그는 Digital Certificate Certification Center 웹 사이트에서 내 공개 키를 다운로드 한 다음 내 공개 키를 사용하여 암호 텍스트를 해독했습니다. 그는 그것이 실제로 "빌린 은의 200짜리"로 작성되었으므로 Clark은 자신감을 가지고 돈을 빌려 줄 수있었습니다. 클라크가 내 IOU를 훼손 할까 걱정하지 않을 것입니다.
1. Ciphertext가 Clark에게 보냈기 때문에 Clark은 수정할 수 없습니다. Clark은 해독 된 IOU를 수정할 수 있지만 Clark에는 개인 키가 없으므로 IOU를 암호화하는 것을 모방 할 수 없습니다. 이것을 변조 방지라고합니다.
2. IOU가 내 개인 키로 암호화되었으므로 해독 될 수있는 공개 키 만 있습니다. 반대로, 공개 키로 해독 할 수있는 IOU는 개인 키로 암호화되어야하며 개인 키 만 소유해야하므로 Clark 은이 IOU가 저에 의해 작성되었음을 증명할 수 있습니다. 이것을 반 에트라고합니다.
3. 돈을 계속 상환하지 않으면 Clark은 법정에서 저를 고소했으며, 개인 키로 암호화 된이 단어 문서는 Cheng Tang의 인증서로 사용할 수 있습니다. 우리나라는 "중화 인민 공화국의 전자 서명법"을 발행했기 때문에 디지털 서명이 법적으로 효과적입니다.
내 개인 키로 암호화 된이 IOU는 변조 및 반사의 특성을 가지고 있으며 Chengtang의 인증서로 사용될 수 있으며, 이는이 IOU "서명"의 효과와 동일합니다. 그건 그렇고, "내 개인 키로 ious를 암호화하는"프로세스를 디지털 서명이라고합니다.
이것은 일반적으로 사용되는 Java 암호화 기술 및 핵심 코드를 친구의 참조로 작성하는 요약 기사입니다.