JAVA復号化14-対称暗号化アルゴリズム-PBEアルゴリズム

7380 ワード

一、PBEアルゴリズム(Password Base Encryption、パスワードベース暗号化)アルゴリズムは、パスワードベースの暗号化アルゴリズムである.パスワードはユーザ自身が把握し、乱数を採用することを特徴とする多重暗号化などの手法を用いてデータの安全性を保証している.PBEアルゴリズムは鍵の概念がなく、パスワードを鍵としている.鍵の長さがアルゴリズムの安全性に影響し、記憶しにくいため、ここでは自分たちがよく使うパスワードに直接変えると大きく異なり、記憶しやすい.しかし単純なパスワードは辞書法で与えられやすい貧乏が出てきたので、私たちはここでパスワードに「塩」を加えました.この塩とパスワードの組み合わせで、解読するのは難しいです.同時に,塩とパスワードを組み合わせたメッセージ要約アルゴリズムを何度も反復して鍵初期化ベクトルの基本材料を構築し,解読をさらに困難にした.PBEアルゴリズムは新しい暗号化アルゴリズムを構築していないが,AES,DESなどのアルゴリズムのような我々がよく使う対称暗号化アルゴリズムを用いた.
二、模型分析ここで私达はやはり甲乙双発がメッセージを伝えると仮定して、パスワードと塩とアルゴリズムの伝统的な対称暗号化アルゴリズムが必要で、鍵を构筑して、アルゴリズムを指定して、それからデータを送る前に鍵でデータを暗号化して、鍵と暗号化したデータはいっしょに相手に送って、相手は鍵を持ってデータを復号します.今は鍵がなくなりました.私たちは「パスワード+塩」で鍵を作りました.それからデータを暗号化します.ここで「パスワード」を勝手に設定することができます.私たちは自分のパソコンのパスワードを設定することができます.ここで「塩」の設定はランダム数を採用することができます.甲乙双方が約束したデータです.最終的に私たちのパスワードと塩は双方に公表します.情報伝達双方はパスワードを約束し、ここで甲はパスワード2を構築し、甲はパスワードを構築した後、乙に公表する.パスワード構築者(甲)が今回のメッセージングに使用する塩を構築することは、ハードディスク番号、今日の日付など、双方で一つのデータを約束することも可能であり、必ずしも安全アルゴリズムを書いて計算しなければならないとは限らない.双方が一致すればよい4、甲がパスワード、塩を使用してデータを暗号化する5、甲が塩、暗号化データをメッセージング受信者に送信する(乙)6、乙は受け取ったパスワード、塩(約束のデータであってもよい)でデータを解読する
全体的にパスワードと塩の両方を知る必要があります.メッセージングプロセスは、双方の統一アルゴリズムを指定して行う必要があります.これらのアルゴリズムは一般的な対称暗号化アルゴリズムを使っています
三、java 6とbouncycastleがサポートするアルゴリズムのリスト
アルゴリズム#アルゴリズム#
鍵の長さ
鍵の長さのデフォルト
動作モード
じゅうてんほうしき
コメント
PBEWithMD5AndDES
56
56
CBC
PKCS5Padding
JAva 6実装
PBEWithMD5AndTripeDES
112、168
168
CBC
PKCS6Padding
JAva 7実装
PBEWithSHA1AndDESede
112、168
168
CBC
PKCS7Padding
JAva 8実装
PBEWithSHA1AndRC2_40
40~1024
128
CBC
PKCS8Padding
JAva 9実装
PBEWithMD5AndDES
64
64
CBC
PKCS5Padding/PKCS7Padding/ISO10126Padding/ZeroBytePadding
BouncyCastle実装
PBEWithMD5AndRC2
128
128
CBC
PKCS5Padding/PKCS7Padding/ISO10127Padding/ZeroBytePadding
BouncyCastle実装
PBEWithSHA1AndDES
64
64
CBC
PKCS5Padding/PKCS7Padding/ISO10128Padding/ZeroBytePadding
BouncyCastle実装
PBEWithSHA1AndRC2
128
128
CBC
PKCS5Padding/PKCS7Padding/ISO10129Padding/ZeroBytePadding
BouncyCastle実装
PBEWithSHAAndIDEA-CBC
128
128
CBC
PKCS5Padding/PKCS7Padding/ISO10130Padding/ZeroBytePadding
BouncyCastle実装
PBEWithSHAAnd2-KeyTripleDES-CBC
128
128
CBC
PKCS5Padding/PKCS7Padding/ISO10131Padding/ZeroBytePadding
BouncyCastle実装
PBEWithSHAAnd3-KeyTripleDES-CBC
192
192
CBC
PKCS5Padding/PKCS7Padding/ISO10132Padding/ZeroBytePadding
BouncyCastle実装
PBEWithSHAAnd128BitRC2-CBC
128
128
CBC
PKCS5Padding/PKCS7Padding/ISO10133Padding/ZeroBytePadding
BouncyCastle実装
PBEWithSHAAnd40BitRC2-CBC
40
40
CBC
PKCS5Padding/PKCS7Padding/ISO10134Padding/ZeroBytePadding
BouncyCastle実装
PBEWithSHAAnd128BitRC4
128
128
CBC
PKCS5Padding/PKCS7Padding/ISO10135Padding/ZeroBytePadding
BouncyCastle実装
PBEWithSHAAnd40BitRC4 40
40
CBC
PKCS5Padding/PKCS7Padding/ISO10136Padding/ZeroBytePadding
BouncyCastle実装
PBEWithSHAAndTwofish-CBC
256
256
CBC
PKCS5Padding/PKCS7Padding/ISO10137Padding/ZeroBytePadding
BouncyCastle実装
四、プログラム展示
package com.ca.test;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
import org.apache.commons.codec.binary.Base64;
/**
 *       :      -PBE    
 *   java6   PBEWITHMD5andDES      
 * @author kongqz
 * */
public class PBECoder {
    
    /**
     * JAVA6          
     * PBEWITHMD5ANDDES
     * PBEWITHMD5ANDTRIPLEDES
     * PBEWITHSHAANDDESEDE
     * PBEWITHSHA1ANDRC2_40
     * PBKDF2WITHHMACSHA1
     * */
    public static final String ALGORITHM="PBEWITHMD5andDES";
    
    /**
     *     
     * */
    public static final int ITERATION_COUNT=100;
    
    /**
     *     
     *       8  
     * @return byte[]  
     * */
    public static byte[] initSalt() throws Exception{
        //        
        SecureRandom random=new SecureRandom();
        //   
        return random.generateSeed(8);
    }
    
    /**
     *     
     * @param password   
     * @return Key   
     * */
    private static Key toKey(String password) throws Exception{
        //      
        PBEKeySpec keySpec=new PBEKeySpec(password.toCharArray());
        //   
        SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(ALGORITHM);
        //    
        SecretKey secretKey=keyFactory.generateSecret(keySpec);
        
        return secretKey;
    }
    /**
     *   
     * @param data      
     * @param password   
     * @param salt  
     * @return byte[]     
     * 
     * */
    public static byte[] encrypt(byte[] data,String password,byte[] salt) throws Exception{
        //    
        Key key=toKey(password);
        //   PBE    
        PBEParameterSpec paramSpec=new PBEParameterSpec(salt,ITERATION_COUNT);
        //   
        Cipher cipher=Cipher.getInstance(ALGORITHM);
        //   
        cipher.init(Cipher.ENCRYPT_MODE, key,paramSpec);
        //    
        return cipher.doFinal(data);
    }
    /**
     *   
     * @param data      
     * @param password   
     * @param salt  
     * @return byte[]     
     * 
     * */
    public static byte[] decrypt(byte[] data,String password,byte[] salt) throws Exception{
        //    
        Key key=toKey(password);
        //   PBE    
        PBEParameterSpec paramSpec=new PBEParameterSpec(salt,ITERATION_COUNT);
        //   
        Cipher cipher=Cipher.getInstance(ALGORITHM);
        //   
        cipher.init(Cipher.DECRYPT_MODE, key,paramSpec);
        //    
        return cipher.doFinal(data);
    }
    /**
     *   PBE          
     * @throws Exception 
     * 
     */
    public static void main(String[] args) throws Exception {
        //     
        String str="PBE";
        //       
        String password="azsxdc";
        
        System.out.println("  :/t"+str);
        System.out.println("  :/t"+password);
        
        //    
        byte[] salt=PBECoder.initSalt();
        System.out.println(" :/t"+Base64.encodeBase64String(salt));
        //    
        byte[] data=PBECoder.encrypt(str.getBytes(), password, salt);
        System.out.println("   :/t"+Base64.encodeBase64String(data));
        //    
        data=PBECoder.decrypt(data, password, salt);
        System.out.println("   :"+new String(data));
    }
}
       :
  : PBE
  : azsxdc
 :  VeEQqRzOw2Y=
   :    7bQTon5WD04=
   :PBE


五、まとめ
PBEは新しく構築されたアルゴリズムではなく、鍵の概念を「パスワード+塩」に変換する方式であり、記憶に不便な鍵を記憶に便利なパスワードアルゴリズムに変換するか、基本的な対称暗号化アルゴリズムを用いるかは、上のサポートテーブルから見ることができる.
これは私たちが銀行に行ったU盾に似ているのではないでしょうか.民生銀行のU盾について言えば、U盾を差し込んで、パスワードを入力する必要があります.それからネットバンクにログインして操作することができて、支払いの时やはり私达がパスワードを入力する必要があります.1.U盾の塩はどこから?そのフラッシュディスクのシーケンス番号が一定の処理を経て得られた値であるべきだ.私たちはUシールドが有効になるため、民生のホールで機械を探して活性化する必要があるからだ.そのアクティブ化の動作は、私たちのUシールドというフラッシュディスクのデータを私たちの個人口座に書き込むべきで、塩の公表をしたことに相当します.パスワードは何ですか.私たちが設定したログインパスワードですね.これは窓口で処理するときにU盾のパスワードを設定する必要があります.アクティブにするとパスワードを変更できます
上の2つがあって、私たちは更に操作を行って、私たちの身分のデータの安全性を送信することができます.ネットバンクのデータ交換は本当に安全です...