📄 mlkbbsgenerator.pas
字号:
unit MLKBBSGenerator;
interface
uses Bin32Hdl;
type
TMLKBBSGenerator = class
private
m, p, q: Integer;
n, z: Integer;
public
constructor Create(Pwd: String);
function NextValue: Integer;
end;
implementation
constructor TMLKBBSGenerator.Create(Pwd: String);
var
l: Byte;
i,j,d: Byte;
leaveout: Array[1..255,0..7] Of Boolean;
no_left: Byte;
row_left: Byte;
begin
{Value m for MLK and p,q for BBS}
m:=0;
p:=0;
q:=0;
l:=Length(Pwd);
For i:=1 To l Do
For j:=0 To 7 Do leaveout[i,j]:=False;
If l>=32 Then Begin
For i:=1 To l Do
For j:=1 To 7 Do leaveout[i,j]:=True;
no_left:=l-32;
If no_left>0 Then Begin
For i:=1 To no_left Do Begin
j:=Round(i*Int(l/no_left));
leaveout[j,0]:=True;
End;
End;
End
Else Begin
If l>=4 Then Begin
row_left:=Round(8-Int(32/l));
If Not(l In [4,8,16]) Then Dec(row_left);
row_left:=8-row_left;
If row_left<7 Then
For i:=1 To l Do
For j:=7 DownTo row_left Do leaveout[i,j]:=True;
no_left:=l-(32 mod l*row_left);
If no_left>0 Then Begin
For i:=1 To no_left Do Begin
j:=Round(i*Int(l/no_left));
leaveout[j,row_left]:=True;
End;
End;
End
Else Begin
no_left:=32-(l*8);
For i:=31-no_left To 31 Do m:=SetBitIn32Word(m,i,True);
End;
End;
d:=0;
For i:=l Downto 1 Do
For j:=0 To 7 Do
If Not(leaveout[i,j]) Then Begin
If (Ord(Pwd[i]) And ($01 Shl j))=($01 Shl j) Then m:=SetBitIn32Word(m,d,True);
Inc(d);
End;
{Extract p,q from m}
d:=0;
For i:=31 DownTo 0 Do Begin
If Odd(i) Then p:=SetBitIn32Word(p,d,GetBitOf32Word(m,i))
Else Begin
q:=SetBitIn32Word(q,d,GetBitOf32Word(m,i));
Inc(d);
End;
End;
{Finalize m}
m:=SetBitIn32Word(m,31,False);
{Finalize p,q}
p:=p+(3-(p mod 4));
q:=q+(3-(q mod 4));
{Value z0 for BBS}
z:=m;
z:=z+(0-(z mod 4));
{Finalize n}
n:=p*q;
end;
function TMLKBBSGenerator.NextValue: Integer;
var
newval: Boolean;
outval: Integer;
i: Integer;
begin
{BBS}
z:=(z*z) mod n;
{MAK}
newval:=GetBitOf32Word(m,0) Xor GetBitOf32Word(m,19);
For i:=1 To 31 Do SetBitIn32Word(m,i-1,GetBitOf32Word(m,i));
SetBitIn32Word(m,31,newval);
{Hash}
outval:=0;
If (GetBitOf32Word(z,13) Xor GetBitOf32Word(m,7)) Then outval:=outval Or $01;
If GetBitOf32Word(z,31) Then outval:=outval Or $02;
If (GetBitOf32Word(z,10) And GetBitOf32Word(m,30)) Then outval:=outval Or $04;
If (GetBitOf32Word(z,23) Or (GetBitOf32Word(m,19) Xor GetBitOf32Word(m,19))) Then outval:=outval Or $08;
If ((GetBitOf32Word(z,17) And GetBitOf32Word(z,27)) Xor GetBitOf32Word(m,16)) Then outval:=outval Or $10;
If GetBitOf32Word(m,13) Then outval:=outval Or $20;
If (GetBitOf32Word(z,20) Xor GetBitOf32Word(m,25)) Then outval:=outval Or $40;
If GetBitOf32Word(z,26) Then outval:=outval Or $80;
NextValue:=outval;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -