// Ein paar von vielen Möglichkeiten eine Prüfziffer(-zahl)
// aus einem String bilden.


// Getestet mit D4 unter Win98

// 1.    Fest vorgegebene Länge
// 1.1   Einstellige Prüfziffer
//       Dient zur Überprüfung, ob bei Übermittlung eines Strings
//       Fehler aufgetreten sind.
// 1.1.1 Modulus 10
//       Mit festgelegter Gewichtung (2, 1, 2, 1 usw.) und Quersumme.

function modulus10(s: string): string; 
var 
  x, y, lg: integer; 
  function quer(w: integer): integer; 
  var 
    s: string; 
    i: integer; 
  begin 
    s := inttostr(w); 
    result := 0; 
    for i := 1 to length(s) do 
      result := result + strtoint(s[i]); 
  end; 
begin 
  lg := length(s); 
  y := succ(lg) * 5; 
  for x := 1 to lg do 
    if odd(x) then 
      y := y + quer(ord(s[x]) * 2) else 
      y := y + ord(s[x]); 
  result := chr((y mod 10) + 48); 
end; 
 
function erzeugeM10(s: string): string; 
begin 
  Result := s + modulus10(s); 
end; 
 
function pruefeM10(s: string): integer; 
var 
  lg: integer; 
begin 
  lg := length(s); 
  if modulus10(copy(s, 1, lg - 1)) = copy(s, lg, 1) 
    then Result := pred(lg) else Result := -1; 
end; 
 
// --- Beispielaufrufe --- 
 
// Prüfziffer anhängen 
 
procedure TForm1.Button1Click(Sender: TObject); 
var 
  s: string; 
begin 
  s := 'Das ist ein kurzer String'; 
  Label1.Caption := erzeugeM10(s); 
end; 
 
// Ziffer prüfen 
 
procedure TForm1.Button2Click(Sender: TObject); 
var 
  i: integer; 
begin 
  i := pruefeM10(Label1.Caption); 
  if i >= 0 then 
    Label1.caption := copy(Label1.Caption, 1, i) 
  else showmessage('Prüfziffer-Fehler'); 
end;

// --------------------------------------------------------------------

// 1.1.2 Modulus 11
//       Mit variabler Gewichtung.

var 
  gewichtung: array[0..3] of byte = (3, 7, 5, 10); 
 
function modulus11(s: string): string; 
var 
  i, x, y, z, lg: integer; 
begin 
  lg := length(s); 
  z := high(gewichtung); 
  y := succ(lg) * 7; 
  i := 0; 
  for x := 1 to lg do begin 
    y := y + ord(s[x]) * gewichtung[i]; 
    inc(i); 
    if i > z then i := 0; 
  end; 
  i := y mod 11; 
  result := chr(i - ord(i = 10) + 48); 
end; 
 
function erzeugeM11(s: string): string; 
begin 
  Result := s + modulus11(s); 
end; 
 
function pruefeM11(s: string): integer; 
var 
  lg: integer; 
begin 
  lg := length(s); 
  if modulus11(copy(s, 1, lg - 1)) = copy(s, lg, 1) 
    then Result := pred(lg) else Result := -1; 
end; 
 
// --- Beispielaufrufe --- 
 
// Prüfziffer anhängen 
 
procedure TForm1.Button1Click(Sender: TObject); 
var 
  s: string; 
begin 
  s := 'Das ist ein Test'; 
  Label1.Caption := erzeugeM11(s); 
end; 
 
// Prüfziffer prüfen 
 
procedure TForm1.Button2Click(Sender: TObject); 
var 
  i: integer; 
begin 
  i := pruefeM11(Label1.Caption); 
  if i >= 0 then 
    Label1.caption := copy(Label1.Caption, 1, i) 
  else showmessage('Prüfziffer-Fehler'); 
end; 


// --------------------------------------------------------------------
 

// 1.2 Mehrstellige Prüfzahlen
// Dient beispielsweise zur Passwort-Überprüfung.
const laenge = 32; 
 
function hash(const s: string): string; 
var 
  x, z, erg: integer; 
begin 
  erg := 1; 
  result := ''; 
  for z := 2 to succ(laenge) do begin 
    for x := 1 to length(s) do 
      erg := (erg * 2 + ord(s[x]) * (z - ord(odd(x)) * (z - 1))) mod 97; 
    result := result + inttostr(erg mod 10) 
  end; 
end; 
 
// Beispielaufruf 
 
const 
  password = '46632272800736162418772068521161'; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if hash('Delphi') <> password then 
    showmessage('Du kummst hier net rein!') 
  else showmessage('Willkommen!'); 
end; 

// --------------------------------------------------------------------

//
2.    Variable Länge
//      (richtet sich immer nach der Länge des Strings)

function pruefzahl(const s: string): string; 
var 
  x, z, erg: integer; 
begin 
  erg := 3; 
  result := ''; 
  for x := 1 to length(s) do begin 
    for z := 2 to 9 do 
      erg := (erg * 2 + ord(s[x]) * (z - ord(odd(x)) * (z - 1))) mod 93; 
    result := result + inttostr(erg mod 10) 
  end; 
end; 
 
 
// Beispielaufruf 
const 
  teststring = '6920670'; 
 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if pruefzahl('Versuch') <> teststring then 
    showmessage('Keine Übereinstimmung!') 
  else showmessage('OK'); 
end; 


Zugriffe seit 6.9.2001 auf Delphi-Ecke