>  기사  >  Java  >  Java에서 일반적으로 사용되는 여러 암호화 알고리즘 공유(4가지 유형)

Java에서 일반적으로 사용되는 여러 암호화 알고리즘 공유(4가지 유형)

高洛峰
高洛峰원래의
2017-01-24 11:35:251117검색

대칭형 암호화 알고리즘은 성숙한 기술을 갖춘 초기 암호화 알고리즘입니다. 대칭 암호화 알고리즘에서는 데이터 송신자가 일반 텍스트(원본 데이터)와 암호화 키(mi yue)를 특수 암호화 알고리즘으로 처리하여 복잡한 암호화 암호문으로 변환하여 전송합니다. 수신자가 암호문을 수신한 후 원본 텍스트를 해독하려면 암호화에 사용된 키와 동일한 알고리즘의 역알고리즘을 사용하여 암호문을 해독하여 읽을 수 있는 일반 텍스트로 복원해야 합니다. 대칭 암호화 알고리즘에서는 송신자와 수신자 모두 이 키를 사용하여 데이터를 암호화하고 해독합니다. 이를 위해서는 암호 해독기가 암호화 키를 미리 알아야 합니다.

간단한 Java 암호화 알고리즘은 다음과 같습니다.

BASE 엄밀히 말하면 암호화 형식이 아니라 인코딩 형식입니다.
MD(Message Digest 알고리즘, 메시지 다이제스트 알고리즘)
SHA( 보안 해시 알고리즘, 보안 해시 알고리즘)
HMAC(해시 메시지 인증 코드, 해시 메시지 인증 코드)

첫 번째는 BASE

베이스가 가장 인기 있는 것입니다. 인터넷 Bit byte code를 전송할 때 사용하는 일반적인 인코딩 방법 중 하나로 MIME의 세부 규격을 담고 있는 RFC~RFC를 확인할 수 있습니다. 기본 인코딩은 HTTP 환경에서 더 긴 식별 정보를 전달하는 데 사용될 수 있습니다. 예를 들어, Java Persistence 시스템 Hibernate에서 Base는 긴 고유 식별자(일반적으로 -bit UUID)를 문자열로 인코딩하는 데 사용되며, 이는 HTTP 양식 및 HTTP GET URL에서 매개변수로 사용됩니다. 다른 애플리케이션에서는 바이너리 데이터를 URL 배치에 적합한 형식(숨겨진 양식 필드 포함)으로 인코딩해야 하는 경우가 많습니다. 이때 Base 인코딩은 읽을 수 없습니다. 즉, 인코딩된 데이터는 육안으로 직접 볼 수 없습니다. (출처 바이두 백과사전)

java 구현 코드:

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的定义,Base被定义为:Base内容传送编码被设计用来把任意序列的位字节描述为一种不易被人直接识别的形式。
(The Base Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE加密的。
*/
public class BASE {
  /**
   * BASE解密
   *
   * @param key
   * @return
   * @throws Exception
   */
  public static byte[] decryptBASE(String key) throws Exception {
    return (new BASEDecoder()).decodeBuffer(key);
  }
  /**
   * BASE加密
   *
   * @param key
   * @return
   * @throws Exception
   */
  public static String encryptBASE(byte[] key) throws Exception {
    return (new BASEEncoder()).encodeBuffer(key);
  }
  public static void main(String[] args) {
   String str="";
    try {
    String result= BASE.encryptBASE(str.getBytes());
     System.out.println("result=====加密数据=========="+result);
     byte result[]= BASE.decryptBASE(result);
     String str=new String(result);
     System.out.println("str========解密数据========"+str);
  } catch (Exception e) {
    e.printStackTrace();
  }
  }
}

두 번째 유형은 MD

MD는 Message-Digest입니다. 완전하고 일관된 정보 전송을 보장하는 데 사용되는 알고리즘(정보 다이제스트 알고리즘)입니다. MD는 컴퓨터에서 널리 사용되는 해시 알고리즘 중 하나입니다(다이제스트 알고리즘 및 해시 알고리즘이라고도 번역됨). MD는 일반적으로 주류 프로그래밍 언어에서 구현되었습니다. 데이터(예: 한자)를 다른 고정 길이 값으로 계산하는 것이 해시 알고리즘의 기본 원리입니다. MD의 전신은 MD, MD 및 MD입니다. 암호화 및 암호 해독 기술에 널리 사용되며 파일 확인에 자주 사용됩니다. 확인하다? 파일의 크기에 관계없이 MD 이후에는 고유한 MD 값이 생성될 수 있습니다. 예를 들어 현재 ISO 교정은 MD 교정입니다. 그것을 사용하는 방법? 물론, MD 값은 ISO가 MD를 통과한 후에 생성됩니다. linux-ISO를 다운로드한 친구들은 일반적으로 다운로드 링크 옆에 MD 문자열이 표시되는 것을 보았습니다. 파일의 일관성을 확인하는 데 사용됩니다.

java 구현:

package com.cn.单向加密;
import java.math.BigInteger;
import java.security.MessageDigest;
/*
MD(Message Digest algorithm ,信息摘要算法)
通常我们不直接使用上述MD加密。通常将MD产生的字节数组交给BASE再加密一把,得到相应的字符串
Digest:汇编
*/
public class MD {
  public static final String KEY_MD = "MD";
  public static String getResult(String inputStr)
  {
    System.out.println("=======加密前的数据:"+inputStr);
    BigInteger bigInteger=null;
    try {
     MessageDigest md = MessageDigest.getInstance(KEY_MD);
     byte[] inputData = inputStr.getBytes();
     md.update(inputData);
     bigInteger = new BigInteger(md.digest());
    } catch (Exception 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개의 16진수 문자열). MD 외에도 sha-, RIPEMD, Haval 등이 유명합니다.

세 번째 유형. SHA

Secure Hash Algorithm은 주로 Digital Signature Standard DSS에 정의된 Digital Signature Algorithm DSA에 적용됩니다. 길이가 ^비트보다 짧은 메시지의 경우 SHA는 1비트 메시지 다이제스트를 생성합니다. 이 알고리즘은 수년에 걸쳐 암호화 전문가에 의해 개발 및 개선되었으며 점점 더 완벽해지고 널리 사용되고 있습니다. 이 알고리즘의 아이디어는 일반 텍스트 조각을 받은 다음 이를 되돌릴 수 없는 방식으로 (보통 더 작은) 암호문 조각으로 변환하는 것입니다. 이는 단순히 입력 코드 문자열을 취하는 것으로 이해될 수도 있습니다(사전 매핑이라고 함). 또는 정보), 이를 더 짧은 고정 숫자 출력 시퀀스, 즉 해시 값(메시지 다이제스트 또는 메시지 인증 코드라고도 함)으로 변환하는 프로세스입니다. 해시 함수 값은 평문의 "지문" 또는 "다이제스트"라고 할 수 있으므로, 해시 값의 전자 서명은 평문의 전자 서명으로 간주할 수 있습니다.

java 구현:

package com.cn.单向加密;
import java.math.BigInteger;
import java.security.MessageDigest;
/*
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,
被广泛地应用于电子商务等信息安全领域。虽然,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);
    byte[] inputData = inputStr.getBytes();
    try {
       MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA);
       messageDigest.update(inputData);
       sha = new BigInteger(messageDigest.digest());
       System.out.println("SHA加密后:" + sha.toString());
    } catch (Exception e) {e.printStackTrace();}
    return 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,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。

java实现代码:

package com.cn.单向加密;
/*
HMAC
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
使用一个密钥生成一个固定大小的小数据块,
即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。*/
import javax.crypto.KeyGenerator;
import 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 Exception
   */
  public static String initMacKey() throws Exception {
    KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
    SecretKey secretKey = keyGenerator.generateKey();
    return BASE.encryptBASE(secretKey.getEncoded());
  }
  /**
   * HMAC加密 :主要方法
   *
   * @param data
   * @param key
   * @return
   * @throws Exception
   */
  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));
  }
  public static String getResult(String inputStr)
  {
    String path=Tools.getClassPath();
    String fileSource=path+"/file/HMAC_key.txt";
    System.out.println("=======加密前的数据:"+inputStr);
    String result=null;
    try {
      byte[] inputData = inputStr.getBytes();
      String key = HMAC.initMacKey(); /*产生密钥*/
      System.out.println("Mac密钥:===" + key);
      /*将密钥写文件*/
      Tools.WriteMyFile(fileSource,key);
      result= HMAC.encryptHMAC(inputData, key);
      System.out.println("HMAC加密后:===" + result);
    } catch (Exception 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";
     String key=null;;
    try {
       /*将密钥从文件中读取*/
       key=Tools.ReadMyFile(fileSource);
       System.out.println("getResult密钥:===" + key);
    } catch (Exception e) {
      e.printStackTrace();}
    String result=null;
    try {
      byte[] inputData = inputStr.getBytes();
      /*对数据进行加密*/
      result= HMAC.encryptHMAC(inputData, key);
      System.out.println("HMAC加密后:===" + result);
    } catch (Exception e) {e.printStackTrace();}
    return result.toString();
  }
  public static void main(String args[])
  {
    try {
       String inputStr = "简单加密";
       /*使用同一密钥:对数据进行加密:查看两次加密的结果是否一样*/
       getResult(inputStr);
       getResult(inputStr);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}

   

以上内容是小编给大家分享的Java常用几种加密算法(四种),希望大家喜欢。

更多分享Java常用几种加密算法(四种)相关文章请关注PHP中文网!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.