macアルゴリズムJava実装の理解
3872 ワード
概念の理解
macアルゴリズムは(Message Authentication Codesメッセージ認証コードアルゴリズム)であり、鍵ハッシュ関数を含むアルゴリズムである.主に異或演算により,他の暗号化アルゴリズムと組み合わせてmac値の演算を実現し,検証に用いる.
インプリメンテーションモード計算するデータを16進数文字列に変換する、例えば、データ: に変換する.一定のルールに従って位置を補い、次のグループに準備するために使用され、一般的には長さ16の倍数の位置補いルールは一般的に16進数のデータ文字列の長さに対してmod 16を余すことを保証し、0であれば、直接データの後ろに16桁の「0000000000000000」をつづり、もし位置補い0であれば、ルールは前後の端で協調して一致しなければならない.ある直接「00」補欠後のデータ: 補位後のデータパケットは一般的に16ビットのグループであり、各グループのデータは1つの配列に格納パケット後のデータ: .パケットデータを排他的または排他的に演算する .他の暗号化アルゴリズムと組み合わせて暗号化計算を行うこの場所で選択可能な暗号化アルゴリズムも多数ある(例えば:3 Dex、AES、RSAなど) .
コード実装計算するデータを16進数文字列に変換する、例えば、データ: に変換する.は一定の規則に従って位置を補い、次のパケットの準備に用いる、一般的に長さ16の倍数 を保証する.補位後のデータパケットは一般的に16ビットのグループであり、各グループのデータは1つの配列に格納パケット後のデータ: .パケットデータを排他的または排他的に演算する .他の暗号化アルゴリズムと組み合わせて暗号化計算を行うこの場所で選択可能な暗号化アルゴリズムも多数ある(例えば:3 Dex、AES、RSAなど) .
ここのDES_3()は3 DES暗号化アルゴリズムの実装である.
macアルゴリズムは(Message Authentication Codesメッセージ認証コードアルゴリズム)であり、鍵ハッシュ関数を含むアルゴリズムである.主に異或演算により,他の暗号化アルゴリズムと組み合わせてmac値の演算を実現し,検証に用いる.
インプリメンテーションモード
woshiceshishujuwoshiceshishujuwoshiceshishuju
から16進数:776F73686963657368697368756A75776F73686963657368697368756A75776F73686963657368697368756A75
776F7368 69636573 68697368 756A7577 6F736869 63657368 69736875 6A75776F 73686963 65736869 7368756A 75000000
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
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
コード実装
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();
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";
}
}
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;
}
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暗号化アルゴリズムの実装である.