ホームページ  >  記事  >  Java  >  Javaでよく使われる複数の暗号化アルゴリズムを共有(4種類)

Javaでよく使われる複数の暗号化アルゴリズムを共有(4種類)

高洛峰
高洛峰オリジナル
2017-01-24 11:35:251117ブラウズ

対称暗号化アルゴリズムは、成熟したテクノロジーを備えた初期の暗号化アルゴリズムです。対称暗号化アルゴリズムでは、データ送信者は平文(元のデータ)と暗号化キー(mi yue)を特別な暗号化アルゴリズムで処理し、複雑な暗号化暗号文に変換して送信します。受信者が暗号文を受け取った後、元のテキストを解読したい場合は、暗号化に使用したキーと、同じアルゴリズムの逆アルゴリズムを使用して暗号文を復号し、読み取り可能な平文に戻す必要があります。対称暗号化アルゴリズムでは、送信者と受信者の両方がこのキーを使用してデータを暗号化および復号化します。これには、復号化者が事前に暗号化キーを知っている必要があります。

簡単な Java 暗号化アルゴリズムは次のとおりです:

BASE 厳密に言えば、暗号化アルゴリズムではなく、エンコード形式です
MD (メッセージ ダイジェスト アルゴリズム、メッセージ ダイジェスト アルゴリズム)
SHA (セキュア ハッシュ アルゴリズム、安全なハッシュ アルゴリズム)
HMAC (ハッシュメッセージ認証コード、ハッシュメッセージ認証コード)

最初のタイプ。BASE

Baseは、インターネット上でビットバイトコードを送信するための最も一般的なエンコード方式の1つであり、MIMEの詳細仕様であるRFC〜RFCを確認できます。 。基本エンコーディングを使用すると、HTTP 環境でより長い識別情報を伝達できます。たとえば、Java Persistence システム Hibernate では、Base を使用して長い固有の識別子 (通常は -bit UUID) を文字列にエンコードし、HTTP フォームおよび HTTP GET URL のパラメーターとして使用されます。他のアプリケーションでは、バイナリ データを URL (非表示のフォーム フィールドを含む) 内に配置するのに適した形式にエンコードする必要があることがよくあります。現時点では、Base エンコーディングは読み取ることができません。つまり、エンコードされたデータは肉眼で直接見ることができません。 (出典 Baidu 百科事典)

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();
  }
  }
}

2 番目. MD

MD は、完全かつ一貫した情報送信を保証するために使用されるメッセージ ダイジェスト アルゴリズム (メッセージ ダイジェスト アルゴリズム) です。コンピュータで広く使用されているハッシュ アルゴリズムの 1 つです (ダイジェスト アルゴリズムやハッシュ アルゴリズムとも訳され、主流のプログラミング言語で一般的に実装されています)。データ (漢字など) を別の固定長の値に計算することが、ハッシュ アルゴリズムの基本原理です。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値を計算するのは簡単です。
. 変更耐性: 元のデータに変更を加えた場合、たとえ 1 バイトを変更しただけであっても、結果の MD 値は大きく異なります。
. 弱い衝突防止: 元のデータとその MD 値がわかっていると、同じ MD 値を持つデータ (つまり、偽造データ) を見つけるのは非常に困難です。
強力な衝突防止: 2 つの異なるデータを見つけて同じ MD 値を持つようにすることは非常に困難です。

MD の機能は、デジタル署名ソフトウェアで秘密鍵に署名する前に、大容量の情報を機密形式に「圧縮」できるようにすることです (つまり、任意の長さのバイト列を 16 進数の文字列に変換します)。ある程度の長さ)。 MD に加えて、より有名なものには、sha-、RIPEMD、Haval などがあります。

3 番目のタイプの SHA

セキュア ハッシュ アルゴリズムは、主にデジタル署名標準 DSS で定義されているデジタル署名アルゴリズム 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 よりも遅く実行されます。

4番目のタイプ。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 までご連絡ください。