为了方便理解,代码未作优化 ^_^
Procedure TForm1.btn1Click(Sender: TObject);
Const
Tab1: Array[0..255] Of Byte = (
$78, $C0, $CF, $B7, $F2, $C1, $C4, $B7, $A2, $C9, $D9, $C4, $EA, $BF, $F1, $A3, $AC, $D7, $F3, $C7, $A3, $BB, $C6, $A3, $AC, $D3, $D2, $C7, $E6, $B2, $D4, $A1,
$A3, $BD, $F5, $C3, $B1, $F5, $F5, $F4, $C3, $A3, $AC, $C7, $A7, $C6, $EF, $BE, $ED, $C6, $BD, $B8, $D4, $A1, $A3, $D3, $FB, $B1, $A8, $C7, $E3, $B3, $C7, $CB,
$E6, $CC, $AB, $CA, $D8, $A3, $AC, $C7, $D7, $C9, $E4, $BB, $A2, $A3, $AC, $BF, $B4, $CB, $EF, $C0, $C9, $A1, $A3, $BE, $C6, $BA, $A8, $D0, $D8, $B5, $A8, $C9,
$D0, $BF, $AA, $D5, $C5, $A3, $AC, $F7, $DE, $CE, $A2, $CB, $AA, $A3, $AC, $D3, $D6, $BA, $CE, $B7, $C1, $A3, $A1, $B3, $D6, $BD, $DA, $D4, $C6, $D6, $D0, $A3,
$AC, $79, $C3, $F7, $D4, $C2, $BC, $B8, $CA, $B1, $D3, $D0, $A3, $AC, $B0, $D1, $BE, $C6, $CE, $CA, $C7, $E0, $CC, $EC, $A1, $A3, $B2, $BB, $D6, $AA, $CC, $EC,
$C9, $CF, $B9, $AC, $E3, $DA, $A3, $AC, $BD, $F1, $CF, $A6, $CA, $C7, $BA, $CE, $C4, $EA, $A1, $A3, $CE, $D2, $D3, $FB, $B3, $CB, $B7, $E7, $B9, $E9, $C8, $A5,
$A1, $A3, $D3, $D6, $BF, $D6, $C7, $ED, $C2, $A5, $D3, $F1, $D3, $EE, $A3, $AC, $B8, $DF, $B4, $A6, $B2, $BB, $CA, $A4, $BA, $AE, $A3, $AC, $C6, $F0, $CE, $E8,
$C5, $AA, $C7, $E5, $D3, $B0, $A3, $AC, $BA, $CE, $CB, $C6, $D4, $DA, $C8, $CB, $BC, $E4, $A1, $A3, $D7, $AA, $D6, $EC, $B8, $F3, $A3, $AC, $B5, $CD, $E7, $B2);
Tab2: Array[0..9] Of Byte = ($33, $44, $CD, $BC, $B1, $ED, $B7, $D6, $CE, $F6);
Var
MacCode, RegCode: String;
i, MacCodeLen: Integer;
EBP_19, EBP_1A, EBP_1B, EBP_1C, EBP_1D, EBP_1E, EBP_1F, EBP_20, EBP_21, EBP_22, EBP_23, EBP_24, EBP_18: Byte;
Begin
MacCode := edtMacCode.Text;
MacCodeLen := Length(MacCode);
If Length(MacCode) <> 16 Then Exit;
For i := 0 To MacCodeLen-1 Do
Begin
EBP_19 := Ord(MacCode[(($199 + i) Mod MacCodeLen) + 1]);
EBP_1A := Ord(MacCode[(($E1 + i) Mod MacCodeLen) + 1]);
EBP_1B := Ord(MacCode[(($1B + i) Mod MacCodeLen) + 1]);
EBP_1C := Ord(Tab1[EBP_19]);
EBP_1D := Ord(Tab1[EBP_1A]);
EBP_1E := Ord(Tab1[EBP_1B]); //正确
EBP_1F := Ord(Tab2[($BB + i) Mod $A]);
EBP_20 := Ord(Tab2[($15 + i) Mod $A]);
EBP_21 := Ord(MacCode[(($886 + i) Mod MacCodeLen) + 1]);
EBP_22 := Ord(Tab2[($C0 + i) Mod $A]); //正确
EBP_23 := Ord(Tab2[($144 + i) Mod $A]);
EBP_24 := Ord(Tab1[(EBP_21 + EBP_22) And $FF]); //正确
EBP_18 := (EBP_1F * EBP_1F * EBP_1C + EBP_1D * EBP_20 + EBP_1E) And $FF;
RegCode := RegCode + IntToStr((EBP_23 * EBP_18 + EBP_24) Mod $A);
End;
edtRegCode.Text := RegCode;
End;
上传的附件: