Base 64、MD 5、RSAとASE暗号化アルゴリズムの総括とJAVA実現-MD 5


一般的な暗号化アルゴリズム


一般的な暗号化アルゴリズムは,対称暗号化アルゴリズム,非対称暗号化アルゴリズム,Hashアルゴリズムの3つに分類できる.

MD5


MD 5メッセージ要約演算アルゴリズム(英語:MD 5 Message-Digest Algorithm)は、広く使用されている暗号コンパクト関数であり、128ビット(16ビットメタグループ)のハッシュ値(hash value)を生成し、情報伝送が完全に一致することを確保することができる.MD 5アルゴリズムは、一方向ハッシュアルゴリズムの一種(一方向ハッシュアルゴリズムはHASHアルゴリズムとも呼ばれる)であり、不可逆暗号化アルゴリズムである.

げんり


MD 5アルゴリズムの簡単な説明は、次のとおりです.
MD 5は入力された情報を512ビットパケットで処理し、各パケットは16個の32ビットパケットに分割され、一連の処理を経た後、アルゴリズムの出力は4つの32ビットパケットからなり、この4つの32ビットパケットをカスケードした後、128ビットハッシュ値を生成する.
プロセス:
  • データ入力.メッセージにデータを埋め込み、メッセージの長さ対512を448にモデリングし、メッセージの長さをX、すなわちX mod 512=448とする.この式に基づいて、入力するデータの長さを求めます.≪埋め込み方法|Fill Method|emdw≫:メッセージの後に埋め込み、最初のビットは1で、残りは0です.
  • メッセージ長を追加します.最初のステップの結果の後に元のメッセージの長さを入力し、使用可能なストレージの長さは64ビットです.メッセージ長が264より大きい場合、メッセージ長が264に対してダイシングされた64ビット低い値のみが使用される.このステップが完了すると、最終メッセージ長は512の整数倍になる.
  • データ処理.必要なデータを準備:4つの定数:A=0 x 67452301,B=0 x 01EFCDAB 89,C=0 x 98 BADCFE,D=0 x 10325476;4つの関数:F(X,Y,Z)=(X&Y)|(~X)&Z);G(X,Y,Z)=(X & Z) | (Y & (~Z)); H(X,Y,Z)=X ^ Y ^ Z; I(X,Y,Z)=Y ^ (X | (~Z)); メッセージを512ビットのパケットに分けて処理し、各パケットを4回変換し、上記の4つの定数を先頭変数として計算し、4つの変数を再出力し、この4つの変数で次のパケットの演算を行い、既に最後のパケットであれば、この4つの変数が最後の結果、すなわちMD 5値となる.

  • JAVA実現

     public static  class Encrypt{
             //    
            private  final String  DEFAULT_SALT=">sd?ds;
            private Encrypt() {
            }
            static final Encrypt INSTANCE = new Encrypt();
            public  String toMd5String(String originString) {
                return toMd5String(originString,DEFAULT_SALT);
            }
            public  String toMd5String(String originString,String salt) {
                StringBuffer result = null;
                if (originString != null) {
                    try {
                        result = new StringBuffer();
                        //         MD5
                        MessageDigest md = MessageDigest.getInstance("MD5");
                        //       
                        //  
                        byte bytes[] = md.digest(new StringBuffer(salt).append(originString).toString().getBytes("ISO8859-1"));
                        for (byte b :bytes) {
                            //                     0xff                32 
                            String str = Integer.toHexString(b & 0xFF);
                            if (str.length() == 1) {
                                result.append("b") ;
                            }
                            result.append(str);
                        }
                    }catch (UnsupportedEncodingException e){
                        e.printStackTrace();
                    }
                    catch (NoSuchAlgorithmException e) {
                        e.printStackTrace();
                    }
                }
                return result.toString();
            }
        }