⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mlkbbsgenerator.pas

📁 wbs43open-src.zip 数字隐藏工具
💻 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 + -