JAVA基礎浅談3 DES暗号解読


ネットバンクを使うとき、銀行カードが盗まれるのではないかと心配していますか?
友达とQQでチャットする时、あなたのプライバシーが漏れることを心配していますか?
開発者として、安全なコードを書くことは優雅なコードを書くよりも重要です.安全はすべての応用の根本だからです.データが侵されないように
暗号化/復号化技術の運用によって生まれた.――『Java暗号解読の芸術』より抜粋
 
したがって、データ転送とデータストレージのセキュリティを確保するために、特定のアルゴリズムによって、データ明文を複雑な暗号化することができます.
多くの暗号化手段は、単項暗号化と双方向暗号化に大きく分けることができる.単項暗号化とは、データの要約計算により暗号文を生成し、暗号文が可逆的にプッシュされないことを指す.
還元、例えばBase 64、MD 5、SHAなどがある.双方向暗号化は逆に,密文を逆プッシュして明文に復元できることを指し,そのうち双方向暗号化は対称加算に分けられる.
密および非対称暗号化.対称暗号化とは、データ使用者が同じ鍵を持っていなければ暗号解読できないことを意味し、暗号のセットを共有しているようにします.
同様に、対称暗号化の手段としては、DES、3 DES、AES、IDEA、RC 4、RC 5等がある.対称暗号化ではなく、対称暗号化に対して同じものを持つ必要はありません.
「情報公開鍵交換プロトコル」である鍵のセット.非対称暗号化には、公開鍵とプライベート鍵の2つの鍵、公開鍵、プライベート秘密が必要です.
鍵はペアリングされ,すなわち公開鍵を用いてデータ暗号化され,対応するプライベート鍵のみが復号される.このような暗号化手段は
RSA、DSAなど.
                                                                                            
【暗号学常用用語】
明文:暗号化されていないデータ
暗号:暗号化されたデータ
暗号化:明文を暗号化に変換するプロセス
復号:暗号を明文に変換するプロセス
暗号化アルゴリズム:明文を密文に変換する変換アルゴリズム
復号アルゴリズム:暗号文を明文に変換する変換アルゴリズム
≪暗号化キー|Encryption Key|oem_src≫:アルゴリズムを暗号化するためのキー
≪復号鍵|Decrypte Keys|emdw≫:復号アルゴリズムによる復号操作に使用される鍵
    
 
 
初識3 DES
3 DESは、3 DESedeまたはTripleDESとも呼ばれ、三重データ暗号化であり、逆プッシュ可能なアルゴリズムスキームである.
1975年に米IBM社がDES暗号化アルゴリズムの研究と発表に成功したが、DES暗号長は暴力的に解読されやすく、DESアルゴリズムを変更することで
はい、データブロックごとに3回のDES暗号化、すなわち3 DES暗号化アルゴリズムを行います.
しかし、3 DESのアルゴリズムは公開されているため、アルゴリズム自体には秘密はなく、主に唯一の鍵に頼ってデータ暗号化復号の安全を確保している.
3 DESはいったい安全なのかと聞かれるかもしれません.これまで3 DESを解読できる人はいなかったので、それを解読できればショックです.
情報セキュリティ全体が...
 
【Java 3 DES暗号解読の流れ】
①共通に約束された鍵(keyBytes)およびアルゴリズム(Algorithm)を入力し、SecretKey鍵オブジェクトを構築する
        SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);    
②アルゴリズムに基づいてCipherオブジェクトをインスタンス化する.暗号化/復号化を担当します
        Cipher c1 = Cipher.getInstance(Algorithm);    
③暗号化/復号モードおよびSecretKeyキーオブジェクトへの入力、Cipherオブジェクトのインスタンス化
        c1.init(Cipher.ENCRYPT_MODE, deskey);    
④バイト配列を入力、Cipherを呼び出す.doFinal()メソッドは、暗号化/復号化を実現し、byteバイト配列を返します.
        c1.doFinal(src);
 
 
3 DESケース
 
—SecretUtils.JAva(3 DES暗号解読ツールクラス)-
package my3des;
 
import java.io.UnsupportedEncodingException;
 
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
 
 
/**
 * SecretUtils {3DES         }
 * @author William
 * @date 2013-04-19
 */
public class SecretUtils {
 
    //      , DES、DESede( 3DES)、Blowfish
    private static final String Algorithm = "DESede";    
    private static final String PASSWORD_CRYPT_KEY = "2012PinganVitality075522628888ForShenZhenBelter075561869839";
    
    
    /**
     *     
     * @param src         
     * @return 
     */
    public static byte[] encryptMode(byte[] src) {
        try {
             SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);    //    
             Cipher c1 = Cipher.getInstance(Algorithm);    //       /   Cipher   
             c1.init(Cipher.ENCRYPT_MODE, deskey);    //        
             return c1.doFinal(src);
         } catch (java.security.NoSuchAlgorithmException e1) {
             e1.printStackTrace();
         } catch (javax.crypto.NoSuchPaddingException e2) {
             e2.printStackTrace();
         } catch (java.lang.Exception e3) {
             e3.printStackTrace();
         }
         return null;
     }
    
    
    /**
     *     
     * @param src        
     * @return
     */
    public static byte[] decryptMode(byte[] src) {      
        try {
            SecretKey deskey = new SecretKeySpec(build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);
            Cipher c1 = Cipher.getInstance(Algorithm);
            c1.init(Cipher.DECRYPT_MODE, deskey);    //        
            return c1.doFinal(src);
        } catch (java.security.NoSuchAlgorithmException e1) {
            e1.printStackTrace();
        } catch (javax.crypto.NoSuchPaddingException e2) {
            e2.printStackTrace();
        } catch (java.lang.Exception e3) {
            e3.printStackTrace();
        }
        return null;
     }
    
    
    /*
     *               
     * @param keyStr      
     * @return 
     * @throws UnsupportedEncodingException
     */
    public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException{
        byte[] key = new byte[24];    //    24      ,      0
        byte[] temp = keyStr.getBytes("UTF-8");    //          
        
        /*
         *       
         * System.arraycopy(   ,          ,    ,     )
         */
        if(key.length > temp.length){
            //  temp  24 ,   temp          key   
            System.arraycopy(temp, 0, key, 0, temp.length);
        }else{
            //  temp  24 ,   temp  24       key   
            System.arraycopy(temp, 0, key, 0, key.length);
        }
        return key;
    } 
}

 
—Main.JAva(テストクラス)-
package my3des;
 
public class Main {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        String msg = "3DES      ";
        System.out.println("【   】:" + msg);
        
        //  
        byte[] secretArr = SecretUtils.encryptMode(msg.getBytes());    
        System.out.println("【   】:" + new String(secretArr));
        
        //  
        byte[] myMsgArr = SecretUtils.decryptMode(secretArr);  
        System.out.println("【   】:" + new String(myMsgArr));
    }
}

 
 
補足説明
・3 DESの鍵は24ビットのbyte配列でなければならない
勝手にStringを1つ持ってきてください.getBytes()はだめです.次のエラーが表示されます.
        java.security.InvalidKeyException: Invalid key length: 59 bytes
解決策はたくさんあります.1鍵の固定長で文字列を再定義します.②文字列をBase 64またはMD 5で暗号化し、固定長の
文字はbyte配列に変換されます.③文字列をByte配列に変換し、その配列を修正し、長さが長すぎると一部のみ切り取り、長さが足りない場合はゼロを補う
 
・暗号化結果の符号化方式が一致すること
byte配列から文字列に変換するには、base 64処理と16進数処理の2つの方法が一般的である.
    
・参考資料
3 DESオンラインテストツール:http://www.seacha.com/tools/3des.php
原文アドレス:クリックしてリンクを開く