Aufgrund einer akuten Spamwelle ist das Editieren für nicht angemeldete Benutzer zur Zeit deaktiviert. Wir bitten um Verständnis.

Scripte:SHA1

Aus Clonk Wiki

Wechseln zu: Navigation, Suche

Allgemein

Hilfsfunktion, die den SHA1-Hash eines Strings berechnet. Kann man zum Beispiel verwenden, um in Raetselszenarien die richtige Antwort zu verbergen. Im Script prueft man dann nur, ob der Hash der eingegebenen Antwort stimmt und muss so nicht die richtige Loesung ins Script schreiben.

  SHA1
Kategorie: Zeichenketten
Autor: Sven2
Behandelt: {{{Behandelt}}}
Empfohlenes Vorwissen: {{{Vorwissen}}}
Benötigt Objektpacks: {{{Packs}}}
Stufe: Experte Experte Experte Experte






Script

C4Script
/* Compute a hash of string */

#strict 2

global
 
func
 
SHA1m(string
 
s)
{
  
var
 
h0
 
=
 
0x67452301,
      
h1
 
=
 
0xEFCDAB89,
      
h2
 
=
 
0x98BADCFE,
      
h3
 
=
 
0x10325476,
      
h4
 
=
 
0xC3D2E1F0;

  
var
 
sal
 
=
 
((GetLength(s)+8)/64+1)*16;
  
var
 
sa
 
=
 
CreateArray(sal),
 
sat
 
=
 
CreateArray(80);

  
var
 
i,j,k,l=GetLength(s),a,b,c,d,e,f,g;

  
for
 
(i=0;
 
i<l;
 
++i)
 
sa[i/4]
 
|=
 
(GetChar(s,i)
 
<<
 
(8*(3-i%4)));
  
sa[i/4]
 
|=
 
(0x80
 
<<
 
(8*(3-i%4)));
  
sa[sal-1]=l*8;
  

  
i=0;
  
while
 
(i<sal)
  
{
    
for
 
(j=0;j<16;++j)
 
sat[j]=CastInt(sa[i+j]);
 
// C4Script erfindet C4IDs...
    
for
 
(;j<80;++j)
    
{
      
k
 
=
 
sat[j-3]^sat[j-8]^sat[j-14]^sat[j-16];
      
sat[j]=((k&0x7fffffff)<<1)|(k<0);
    
}
    
a=h0;
 
b=h1;
 
c=h2;
 
d=h3;
 
e=h4;
    
for
 
(j=0;j<80;++j)
    
{
      
if
 
(j<20)
      
{
        
f
 
=
 
(b&c)|((~b)&d);
        
k
 
=
 
0x5A827999;
      
}
      
else
 
if
 
(j<40)
      
{
        
f
 
=
 
b^c^d;
        
k
 
=
 
0x6ED9EBA1;
      
}
      
else
 
if
 
(j<60)
      
{
        
f
 
=
 
(b&c)|(b&d)|(c&d);
        
k
 
=
 
0x8F1BBCDC;
      
}
      
else
      
{
        
f
 
=
 
b^c^d;
        
k
 
=
 
0xCA62C1D6;
      
}
      
g
 
=
 
((a&0x7fffffff)<<5)|((a<0)*0x10)|((a&0x78000000)>>27);
      
g
 
+=
 
e+f+k+sat[j];
      
e
 
=
 
d;
      
d
 
=
 
c;
      
c
 
=
 
((b&0x7fffffff)<<30)|((b<0)*0x20000000)|((b&0x7ffffffc)>>2);
      
b
 
=
 
a;
      
a
 
=
 
g;
    
}
    
h0+=a;
 
h1+=b;
 
h2+=c;
 
h3+=d;
 
h4+=e;
    
i+=16;
  
}
  

  
return
 
Format("%08x%08x%08x%08x%08x",h0,h1,h2,h3,h4);
}

Das Script kann beispielsweise in einer Datei in der System.c4g des Szenarios abgelegt werden.

Beispiel

Angenommen, der Spieler wurde per CallMessageBoard-Aufruf dazu aufgefordert, eine Antort einzugeben. Dann wird die Antwort im InputCallback geprueft:

C4Script
func
 
InputCallback(string
 
answer)
{
  
if
 
(SHA1m(answer)
 
==
 
"1d8adb64415fef5895e8611a96bca8d02e39c4ce")
  
{
    
Message("Die Antwort ist richtig!");
  
}
  
else
  
{
    
Message("Die Antwort ist falsch!");
  
}
}

"Die Antwort ist richtig!" wird nur ausgegeben, wenn der Spieler "Clonk" eingetippt hat. Dabei steht das Loesungswort nirgends im Script.

Scripte des Scripte-Projekts
AnfängerBonbon · Context-Eintrag · EliminateTeam · Flint:Partikelschleuder · Hüpfbonbon · TeamMessage
Fortgeschrittene FortgeschritteneFlint:HitCounter · Flint:Partikelkreis · Flint:Partikelschleuder2 · Is-Funktionen · Menü:Beim Start der Runde · Normaler Flint · Partikel-Linie in den Himmel · Rakete · Random · Relaunch · Return · Sichtweite · Spawn · Startposition
Profi Profi ProfiClantag · Gift-Effekt · Unverwundbarkeit · Scoreboard · Zufallsgespräch
Experte Experte Experte ExperteLebensbalken · Nachrichten bei Sichtkontakt · Object2Overlay · SHA1


Wipfhunt.png Dieser Artikel wurde gemäß der Scriptrichtlinien veröffentlicht.
extern