macアルゴリズムJava実装の理解

3872 ワード

概念の理解
macアルゴリズムは(Message Authentication Codesメッセージ認証コードアルゴリズム)であり、鍵ハッシュ関数を含むアルゴリズムである.主に異或演算により,他の暗号化アルゴリズムと組み合わせてmac値の演算を実現し,検証に用いる.
インプリメンテーションモード
  • 計算するデータを16進数文字列に変換する、例えば、データ:woshiceshishujuwoshiceshishujuwoshiceshishujuから16進数:776F73686963657368697368756A75776F73686963657368697368756A75776F73686963657368697368756A75
  • に変換する.
  • 一定のルールに従って位置を補い、次のグループに準備するために使用され、一般的には長さ16の倍数の位置補いルールは一般的に16進数のデータ文字列の長さに対してmod 16を余すことを保証し、0であれば、直接データの後ろに16桁の「0000000000000000」をつづり、もし位置補い0であれば、ルールは前後の端で協調して一致しなければならない.ある直接「00」補欠後のデータ:776F7368 69636573 68697368 756A7577 6F736869 63657368 69736875 6A75776F 73686963 65736869 7368756A 75000000
  • 補位後のデータパケットは一般的に16ビットのグループであり、各グループのデータは1つの配列に格納パケット後のデータ:
  • .
     0   :776F7368 69636573
     1   :68697368 756A7577
     2   :6F736869 63657368
     3   :69736875 6A75776F
     4   :73686963 65736869
     5   :7368756A 75000000
    
  • パケットデータを排他的または排他的に演算する
  • .
     0   :       776F7368 69636573
     1   :       68697368 756A7577
     1     ( 0   1     ):   1F060000 1C091004
     2   :       6F736869 63657368
     2     ( 1       2     ):   70756869 7F6C636C
     3   :       69736875 6A75776F
     3     ( 2       3     ):   1906001C 15191403
     4   :       73686963 65736869
     4     ( 3       4     ):   6A6E697F 706A7C6A
     5   :        7368756A 75000000
      4     :  19061C15 056A7C6A
    
  • 他の暗号化アルゴリズムと組み合わせて暗号化計算を行うこの場所で選択可能な暗号化アルゴリズムも多数ある(例えば:3 Dex、AES、RSAなど)
  • .
           16   31393036 31433135 30353641 37433641
    
      8          (          )
     8      :  613A342B ED50BC09
      8      :510F026A DA138A48
         :        3550F588 19AA72AE
           16   33353530 46353838 31394141 37324145
    
     8    MAC:  33353530 46353838
    MAC(     ):3550F588
    

    コード実装
  • 計算するデータを16進数文字列に変換する、例えば、データ:woshiceshishujuwoshiceshishujuwoshiceshishujuから16進数:
  • に変換する.
    StringBuffer hex = new StringBuffer();  
    try {  
         byte[] bs = asc.toUpperCase().getBytes("UTF-8");  
         for (byte b : bs) {  
                    hex.append(Integer.toHexString(new Byte(b).intValue()));  
         }  
    } catch (UnsupportedEncodingException e) {  
         e.printStackTrace();  
    }  
    return hex.toString();
    
  • は一定の規則に従って位置を補い、次のパケットの準備に用いる、一般的に長さ16の倍数
  • を保証する.
    int len = data.length();  
    int arrLen = len / 16 + 1;  
    String[] D = new String[arrLen];  
    if (len % 16 == 0) {  
        data += "0000000000000000";  
    } else {  
        data += "00";  
        for (int i = 0; i < 15 - len % 16; i++) {  
            data += "00";  
        }  
    }
    
  • 補位後のデータパケットは一般的に16ビットのグループであり、各グループのデータは1つの配列に格納パケット後のデータ:
  • .
    for (int i = 0; i < arrLen; i++) {  
        D[i] = data.substring(i * 16, i * 16 + 16);  
    }
    
  • パケットデータを排他的または排他的に演算する
  • .
    String I = xOr(D[0], vector);  
    String O = null;  
    String kl = key.substring(0, 16);  
    for (int i = 1; i < arrLen; i++) {  
    //                       ,       
    //      O = DES_1(I, kl, 0); 
        String str = D[i];
        I = xOr(D[i], I);  
    }
    
    public static String xOr(String s1, String s2) {  
        int[] iArr = diffOr(string2Binary(s1), string2Binary(s2));  
        return binary2ASC(intArr2Str(iArr));  
    }
    
    public static int[] diffOr(int[] source1, int[] source2) {  
        int len = source1.length;  
        int[] dest = new int[len];  
        for (int i = 0; i < len; i++) {  
            dest[i] = source1[i] ^ source2[i];  
        }  
        return dest;  
    }
    
  • 他の暗号化アルゴリズムと組み合わせて暗号化計算を行うこの場所で選択可能な暗号化アルゴリズムも多数ある(例えば:3 Dex、AES、RSAなど)
  • .
    String hex = ASC_2_HEX(I);
    String tep1 = hex.substring(0, hex.length()/2);
    String tep2 = hex.substring(hex.length()/2, hex.length());
    I = DES_3(tep1, key, HEX);
    I = xOr(I, tep2);
    I = DES_3(I, key, 0);
    

    ここのDES_3()は3 DES暗号化アルゴリズムの実装である.