대칭 암호화 알고리즘은 성숙한 기술을 갖춘 초기 암호화 알고리즘입니다. 대칭 암호화 알고리즘에서는 데이터 송신자가 일반 텍스트(원본 데이터)와 암호화 키(mi yue)를 특수 암호화 알고리즘으로 처리하여 복잡한 암호화 암호문으로 변환하여 전송합니다. 수신자가 암호문을 수신한 후 원본 텍스트를 해독하려면 암호화에 사용된 키와 동일한 알고리즘의 역알고리즘을 사용하여 암호문을 해독하여 읽을 수 있는 일반 텍스트로 복원해야 합니다. 대칭 암호화 알고리즘에서는 송신자와 수신자 모두 이 키를 사용하여 데이터를 암호화하고 해독합니다. 이를 위해서는 암호 해독기가 암호화 키를 미리 알아야 합니다.
간단한 Java 암호화 알고리즘은 다음과 같습니다.
BASE는 엄밀히 말하면 암호화 알고리즘이 아닌 인코딩 형식입니다.
MD(메시지 다이제스트 알고리즘, 메시지 다이제스트 알고리즘)
SHA(보안 해시 알고리즘, 보안 해시 알고리즘)
HMAC(해시 메시지 인증 코드, 해시 메시지 인증 코드)
유형 1. 베이스
Base는 인터넷에서 Bit 바이트 코드를 전송하는 가장 일반적인 인코딩 방법 중 하나입니다. MIME에 대한 자세한 사양이 나와 있는 RFC~RFC를 볼 수 있습니다. 기본 인코딩은 HTTP 환경에서 더 긴 식별 정보를 전달하는 데 사용될 수 있습니다. 예를 들어, Java Persistence 시스템 Hibernate에서 Base는 긴 고유 식별자(일반적으로 -bit UUID)를 문자열로 인코딩하는 데 사용되며, 이는 HTTP 양식 및 HTTP GET URL에서 매개변수로 사용됩니다. 다른 애플리케이션에서는 바이너리 데이터를 URL 배치에 적합한 형식(숨겨진 양식 필드 포함)으로 인코딩해야 하는 경우가 많습니다. 이때 Base 인코딩은 읽을 수 없습니다. 즉, 인코딩된 데이터는 육안으로 직접 볼 수 없습니다. (출처: 바이두백과사전)
자바 구현 코드:
package com.cn. import sun.misc.BASEDecoder; import sun.misc.BASEEncoder;/*BASE 암호화 및 해독은 양방향이며 BASEEncoder 및 BASEDecoder는 비공식 JDK 구현입니다. 수업. JDK에서는 찾아서 사용할 수 있지만 API에서는 찾을 수 없습니다. JRE에서 sun 및 com.sun으로 시작하는 클래스는 문서화되지 않았습니다. 이들은 java 및 javax 클래스 라이브러리의 기반에 속하며 대부분의 구현은 기본 플랫폼과 관련되어 있으며 일반적으로 권장되지 않습니다. 엄밀히 말하면 BASE는 인코딩 형식인 반면, 비암호화 알고리즘에는 주로 BASEEncoder와 BASEDecoder라는 두 클래스가 포함됩니다. 해당 메서드를 사용하는 방법만 알면 됩니다. 또한, BASE 암호화 후 생성되는 바이트 수는 의 배수입니다. 바이트 수가 부족할 경우 = 기호로 채웁니다. BASE RFC의 정의에 따르면 베이스는 다음과 같이 정의됩니다. 기본 콘텐츠 전송 인코딩은 사람이 직접 쉽게 인식할 수 없는 형식으로 비트 시퀀스를 설명하도록 설계되었습니다. (기본 콘텐츠 전송 인코딩은 사람이 읽을 필요가 없는 형식으로 임의의 옥텟 시퀀스를 나타내도록 설계되었습니다.) 이메일 및 http 암호화에서 흔히 볼 수 있는 HTTP 정보를 가로챌 때 로그인을 위한 사용자 이름 및 비밀번호 필드를 찾을 수 있습니다. BASE를 통해 암호화됩니다. */public class BASE { /** * BASE 복호화* * @param key * @return * @throws 예외 */ public static byte[] decryptBASE(String key) throws Exception { return (new BASEDecoder()).decodeBuffer(key ); } /** * BASE 암호화* * @param key * @return * @throws 예외 */ public static String encryptBASE(byte[] key) 예외 발생 { return (new BASEEncoder()).encodeBuffer(key); } public static void main(String[] args) { String str=""; try { String result= BASE.encryptBASE(str.getBytes()); out.println("result=====암호화된 데이터=========="+result); BASE.decryptBASE(result); str=new String(result); System.out.println("str========복호화된 데이터========"+str) } catch (예외 e) { e.printStackTrace( ) } }}
두 번째 유형.
MD는 완전하고 일관된 정보 전송을 보장하기 위해 사용되는 메시지 다이제스트 알고리즘(Message-Digest Algorithm)입니다. MD는 컴퓨터에서 널리 사용되는 해시 알고리즘 중 하나입니다(다이제스트 알고리즘 및 해시 알고리즘이라고도 번역됨). MD는 일반적으로 주류 프로그래밍 언어에서 구현되었습니다. 데이터(예: 한자)를 다른 고정 길이 값으로 계산하는 것이 해시 알고리즘의 기본 원리입니다. MD의 전신은 MD, MD 및 MD입니다. 암호화 및 암호 해독 기술에 널리 사용되며 파일 확인에 자주 사용됩니다. 확인하다? 파일의 크기에 관계없이 MD 이후에는 고유한 MD 값이 생성될 수 있습니다. 예를 들어 현재 ISO 교정은 MD 교정입니다. 그것을 사용하는 방법? 물론, MD 값은 ISO가 MD를 통과한 후에 생성됩니다. linux-ISO를 다운로드한 친구들은 일반적으로 다운로드 링크 옆에 MD 문자열이 표시되는 것을 보았습니다. 파일의 일관성을 확인하는 데 사용됩니다.
자바 구현:
package com.cn.단방향 암호화; import java.math.BigInteger; import java.security.MessageDigest;/*MD (메시지 다이제스트 알고리즘, 메시지 다이제스트 알고리즘) 일반적으로 위의 MD 암호화를 직접 사용하지 않습니다. 일반적으로 MD에서 생성된 바이트 배열은 BASE로 전달된 후 암호화되어 해당 문자열을 얻습니다. Digest: Assembly*/public class MD { public static final String KEY_MD = "MD" public static String getResult(String inputStr) { System .out.println("========암호화 전 데이터:"+inputStr); BigInteger bigInteger=null; MessageDigest.getInstance(KEY_MD); byte[] inputData = inputStr.getBytes(); md.update(inputData); bigInteger = new BigInteger(md.digest()) } catch(예외 e) {e.printStackTrace(); } System.out.println("MD 암호화 후:" + bigInteger.toString()) return bigInteger.toString(); } public static void main(String args[]) { try { String inputStr = "간단한 암호화"; getResult(inputStr) } catch(Exception e) { e.printStackTrace();
MD 알고리즘은 다음과 같은 특징을 가지고 있습니다.
압축성: 모든 길이의 데이터에 대해 계산된 MD 값의 길이는 고정됩니다.
, 계산 용이 : 원본 데이터에서 MD 값을 쉽게 계산할 수 있습니다.
수정 저항: 원본 데이터가 변경되면 단일 바이트만 수정되어도 결과 MD 값이 매우 달라집니다.
, 약한 충돌 방지: 원본 데이터와 해당 MD 값을 알면 동일한 MD 값을 갖는 데이터(즉, 위조된 데이터)를 찾기가 매우 어렵습니다.
, 강력한 충돌 방지: 서로 다른 두 데이터가 동일한 MD 값을 갖도록 찾는 것은 매우 어렵습니다.
MD의 기능은 개인 키를 디지털로 서명하기 전에 대용량 정보를 기밀 형식으로 "압축"(즉, 임의 길이의 바이트 문자열을 특정 길이의 16진수 문자열로 변환)할 수 있도록 하는 것입니다. 서명 소프트웨어. MD 외에도 sha-, RIPEMD, Haval 등이 더 유명합니다.
세 번째 유형.SHA
Secure Hash Algorithm은 주로 Digital Signature Standard DSS에서 정의된 Digital Signature Algorithm DSA에 적용 가능하다. 길이가 ^비트보다 짧은 메시지의 경우 SHA는 1비트 메시지 다이제스트를 생성합니다. 이 알고리즘은 수년에 걸쳐 암호화 전문가에 의해 개발 및 개선되었으며 점점 더 완벽해지고 널리 사용되고 있습니다. 이 알고리즘의 아이디어는 일반 텍스트 조각을 받은 다음 이를 되돌릴 수 없는 방식으로 (보통 더 작은) 암호문 조각으로 변환하는 것입니다. 이는 단순히 입력 코드 문자열을 취하는 것으로 이해될 수도 있습니다(사전 매핑이라고 함). 또는 정보), 이를 더 짧은 고정 숫자 출력 시퀀스, 즉 해시 값(메시지 다이제스트 또는 메시지 인증 코드라고도 함)으로 변환하는 프로세스입니다. 해시 함수 값은 평문의 "지문" 또는 "다이제스트"라고 할 수 있으므로, 해시 값의 전자 서명은 평문의 전자 서명으로 간주할 수 있습니다.
자바 구현:
package com.cn. import java.math.BigInteger; import java.security.MessageDigest;/*SHA(보안 해시 알고리즘), 디지털 서명 및 기타 암호화 응용 프로그램이 널리 사용됩니다. 전자상거래 등 정보보안 분야에서 널리 활용되고 있다. SHA와 MD 모두 충돌 방법을 통해 크랙되었지만 SHA는 여전히 안전한 암호화 알고리즘으로 인식되며 MD*/public class SHA { public static final String KEY_SHA = "SHA" public static String getResult( String inputStr)보다 안전합니다. { BigInteger sha =null; System.out.println("========암호화 전 데이터:"+inputStr); inputStr.getBytes(); 시도 { MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA); messageDigest.update(inputData) sha = new BigInteger(messageDigest.digest()); System.out.println("SHA 암호화 후:" sha.toString()); } catch (예외 e) {e.printStackTrace();} 반환 sha.toString(); } public static void main(String args[]) { try { String inputStr = "간단한 암호화"; getResult(inputStr) } catch (Exception e) { e.printStackTrace();
SHA-MD와의 비교
둘 다 MD에서 파생되므로 SHA와 MD는 서로 매우 유사합니다. 이에 따라 이들의 강점과 기타 특성은 유사하지만 몇 가지 차이점이 있습니다.
무차별 대입 공격에 대한 보안: 가장 중요하고 중요한 차이점은 SHA 다이제스트가 MD 다이제스트보다 길다는 것입니다. 무차별 대입 기술을 사용하면 다이제스트가 주어진 메시지 다이제스트와 동일한 메시지를 생성하기가 어렵다는 점은 MD의 경우 크기 연산이고 SHA-의 경우 크기 연산입니다. 이러한 방식으로 SHA-는 무차별 대입 공격에 대해 더 큰 강점을 갖습니다.
암호해독에 대한 보안: 암호해독 공격에 취약한 MD 설계로 인해 SHA-는 이러한 공격에 덜 취약한 것으로 보입니다.
속도: SHA-는 동일한 하드웨어에서 MD보다 느리게 실행됩니다.
네 번째 유형.HMAC
HMAC(Hash Message Authentication Code, 해시 메시지 인증 코드, 키 해시 알고리즘 기반 인증 프로토콜) 인증을 달성하기 위한 메시지 인증 코드의 원리는 공용 함수와 키를 사용하여 고정 길이 값을 인증 식별자로 생성하는 것입니다. 이는 메시지의 무결성을 식별하는 키를 사용하여 고정된 크기의 작은 데이터 블록, 즉 MAC를 생성하고 이를 메시지에 추가한 후 인증을 위해 보낸 사람과 공유하는 키를 사용하여 전송합니다.
자바 구현 코드:
package com.cn.단방향 암호화;/*HMACHMAC(해시 메시지 인증 코드, 해시 메시지 인증 코드, 키 해시 알고리즘 기반 인증 프로토콜 메시지 인증 코드의 원리는 공개 함수와 키를 사용하여 고정 길이 값을 인증 식별자로 생성하고 이 식별자를 사용하여 무결성을 인증하는 것입니다. 메시지 성별. 고정된 크기의 작은 데이터 블록, 즉 MAC을 생성하여 메시지에 추가한 후 수신자는 인증 등을 위해 보낸 사람과 공유한 키를 사용합니다. javax.crypto..KeyGenerator;가져오기 javax.crypto.Mac;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import com.cn.comm.Tools;/** * 기본 암호화 구성 요소*/ public abstract class HMAC { public static final String KEY_MAC = "HmacMD"; /** * HMAC 키 초기화* * @return * @throws 예외 */ public static String initMacKey()가 예외를 발생시킵니다. { KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC); SecretKey secretKey = keyGenerator.generateKey(); return BASE.encryptBASE(secretKey.getEncoded()) /** * HMAC 암호화: 기본 메서드 * * @param data * @param key * @return * @throws 예외 */ public static String encryptHMAC(byte[] data, String key) throws Exception { SecretKey secretKey = new SecretKeySpec(BASE.decryptBASE(key), KEY_MAC); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey); return new String(mac.doFinal(data)); static String getResult(String inputStr) { String path=Tools.getClassPath(); fileSource=path+"/file/HMAC_key.txt"; System.out.println("========암호화 전 데이터:"+inputStr) try { byte[] inputData = inputStr. getBytes(); String key = HMAC.initMacKey(); /*키 생성*/ System.out.println("Mac key:===" + key) /*파일에 키 쓰기*/ Tools.WriteMyFile(fileSource,key); result= HMAC.encryptHMAC(inputData, key); System.out.println("HMAC 암호화 후:===" + result) } catch (예외 e) {e.printStackTrace( );} return result.toString(); } public static String getResult(String inputStr) { System.out.println("========암호화 전 데이터:"+inputStr); String path=Tools.getClassPath(); String fileSource=path+"/file/HMAC_key.txt"; ;; try { /*파일에서 키 읽기*/ key=Tools.ReadMyFile(fileSource) System.out.println("getResult key:===" + key); (예외 e) { e.printStackTrace();} String result=null; try { byte[] inputData = inputStr.getBytes() /*데이터 암호화*/ result= HMAC.encryptHMAC(inputData, key); .println("HMAC 암호화 후:===" + result); } catch (예외 e) {e.printStackTrace();} return result.toString(); main(String args[]) { try { String inputStr = "간단한 암호화"; /*동일한 키 사용: 데이터 암호화: 두 암호화의 결과가 동일한지 확인*/ getResult(inputStr); ); } catch (예외 e) { e.printStackTrace() } }}
위 내용은 Java에서 일반적으로 사용되는 여러 가지 암호화 알고리즘(4가지 유형)을 편집자가 공유한 내용이므로 마음에 드셨으면 좋겠습니다.