対称暗号化アルゴリズム-DESおよびDESedeアルゴリズム

3679 ワード

一、簡単に述べる
  対称暗号化アルゴリズムは、データを復号化することができます.暗号化するときは鍵でデータを暗号化し、復号するときは同じ鍵でデータを復号する.
  DESはアメリカ国家標準研究所が提案したアルゴリズムである.復号化されたデータセキュリティは、鍵の長さに比例するためです.desの56ビットの鍵はすでにセキュリティ上の危険性を形成しており、1998年以降はあまり採用されていない.しかし、いくつかの古いシステムはまだ使用されています.このdesアルゴリズムは米国標準委員会にすべてのアルゴリズムを公表されていないため、裏口に残された疑いがある.だから徐々に淘汰された.
  その後desアルゴリズムを改良し,三重desアルゴリズム(DESede)を得た.desアルゴリズムの鍵長が短く,反復回数が少ないという問題に対応して改善され,セキュリティ強度が向上した.しかしdesedeアルゴリズムは処理速度が遅く,鍵計算時間が長く,暗号化効率が高くないという問題で対称暗号化アルゴリズムの発展は楽観的ではない.
二、インタラクティブモデル
1.メッセージング双方が約束した鍵は、通常、メッセージ送信者(甲)が鍵を構築してメッセージ受信者(乙)に通知する.
2、甲は鍵を使用してデータを記憶的に暗号化し、暗号化したデータをネットワークを通じて乙に送る
3、乙はデータを受け取って、約束の鍵でデータを解読する
 
モデル全体はhmacのデータインタラクションプロセスに似ており,鍵の概念であり,鍵は双方が知っている.しかしhmacアルゴリズムは情報要約の取得である.こちらはデータの復号化です
 
三、java 6とbouncycastleのdesアルゴリズムに対するデータ暗号化のサポートはまだ異なる.鍵の長さ、動作モード、および埋め込み方法に現れます.ここでbouncycastleの鍵長は64ビットである.ただし、DESedeアルゴリズムではbouncy castleもjava 6の鍵よりも鍵長が長い.
    しかし、すべての対称暗号化アルゴリズムの実装は類似している.次のコードを参照してください.
1、desアルゴリズム
package com.ca.test;
import java.security.Key;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Base64;
/**
 * DES      
 * @author kongqz
 * */
public class DESCoder {
	/**
	 *     
	 * java  56   ,bouncycastle  64 
	 * */
	public static final String KEY_ALGORITHM="DES";
	
	/**
	 *   /    /    /    
	 * */
	public static final String CIPHER_ALGORITHM="DES/ECB/PKCS5Padding";
	
	/**
	 * 
	 *     ,java6   56   ,bouncycastle  64   
	 * @return byte[]      
	 * */
	public static byte[] initkey() throws Exception{
		
		//        
		KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM);
		//        
		kg.init(56);
		//    
		SecretKey secretKey=kg.generateKey();
		//           
		return secretKey.getEncoded();
	}
	/**
	 *     
	 * @param key      
	 * @return Key   
	 * */
	public static Key toKey(byte[] key) throws Exception{
		//   Des  
		DESKeySpec dks=new DESKeySpec(key);
		//       
		SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(KEY_ALGORITHM);
		//    
		SecretKey secretKey=keyFactory.generateSecret(dks);
		return secretKey;
	}
	
	/**
	 *     
	 * @param data      
	 * @param key   
	 * @return byte[]       
	 * */
	public static byte[] encrypt(byte[] data,byte[] key) throws Exception{
		//    
		Key k=toKey(key);
		//   
		Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
		//   ,       
		cipher.init(Cipher.ENCRYPT_MODE, k);
		//    
		return cipher.doFinal(data);
	}
	/**
	 *     
	 * @param data      
	 * @param key   
	 * @return byte[]       
	 * */
	public static byte[] decrypt(byte[] data,byte[] key) throws Exception{
		//    
		Key k =toKey(key);
		//   
		Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM);
		//   ,       
		cipher.init(Cipher.DECRYPT_MODE, k);
		//    
		return cipher.doFinal(data);
	}
	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		String str="DES";
		System.out.println("  :"+str);
		//     
		byte[] key=DESCoder.initkey();
		System.out.println("  :"+Base64.encodeBase64String(key));
		//    
		byte[] data=DESCoder.encrypt(str.getBytes(), key);
		System.out.println("   :"+Base64.encodeBase64String(data));
		//    
		data=DESCoder.decrypt(data, key);
		System.out.println("   :"+new String(data));
	}
}
       :
  :DES
  :ocewbYVbtmE=
   :w6KsVSkLV3Q=
   :DES

四、まとめ
1、主に設定鍵の長さの変化を見る.同時にbouncycastleはより多くの充填モードをサポートし、java 6で実装されたバージョンよりも同じアルゴリズムで鍵の長さが長い
2、javaのapiにはDES、DESede、PBEの3種類の対称暗号化アルゴリズム鍵材料実装クラスしか提供されていない