Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C-Kurs/digitalesSchloesserKnacken

< C-Kurs
Version vom 4. September 2010, 10:17 Uhr von P.brodmann (Diskussion | Beiträge) (CKURS Aufgabe "digitales Schloesser knacken" Aufgabestellung erstellt)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Aufgabe

In dieser Aufgabe geht es darum für ein digitales Schloss den passenden Schlüssel zu finden. Dabei werden sowohl Schloss als auch Schlüssel durch eine Integer-Variable repräsentiert (genauer gesagt die Binärrepräsentation). Damit ein Schlüssel in zu einem Schloss passt muss der Schlüssel überall dort wo der Schloss 0-en hat eine 1 aufweisen und andersherum genauso. Also muss der Schlüssel das bitweise Komplement des Schlosses sein.

Schlüssel: 010001110 
Schloss:   101110001

Die Schwierigkeit besteht nun darin das der Aufbau des Schlosses nicht bekannt ist. Es muss also probiert werden. Dieses kann mit der Funktion test() geschehen. Diese nimmt einen Schlüssel testet ihn am Schloss und liefert die Anzahl der richtigen Bits als Rückgabewert. Falls der richtige Schlüssel gefunden beendet die Funktion test() automatisch das Programm und gibt eine entsprechende Meldung aus.


Vorgabe

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

unsigned int* abb;
unsigned int versuche = 0;

void generate(void);
int test(unsigned int);
char * toBin(unsigned int);

int main (void)
{
 generate();
 int key = 0;
 /* ab hier kannst du versuchen die Tuer mit deinem Schlüssel zuknacken.
 verändere die Variable Key dazu mit den dir bekannten bitweisen Operatoren
 die du in der Vorlesung kennengelernt hast.
 Du kannst deinen Schlüssel dann mit der Funktion test() mit deinem Schlüssel
 als Parameter testen.
 */




return 0;
}


/* diese Funktion liefert die Anzahl der Richtigen Bits im Übergebenen Schlüssel zurück.
falls 32 zurückgeliefert wird war der Schlüssel richtig und die Tür öffnet sich.
*/
int test(unsigned int toTest)
{
int rightBits = 0;
int i = 0;
for(; i< 32 ; i++){
 unsigned int x = 1 << i;
 if(! ~((toTest & x) ^ (*abb| ~x))){
  rightBits++;
 }
}
if(rightBits == 32){
 printf ("\nGratulation !\n\n");
 printf ("Die Tuer ist offen.\n");
 printf ("So sahen Schluessel und Schloss aus \n");
 printf ("Schloss    : %32s \n", toBin(*abb));
 printf ("Schluessel : %32s \n", toBin(~*abb));
 exit(0);
}else{
 printf ("%d . Versuch, %d richtige Bits \n", ++versuche, rightBits);
 return rightBits;
}
}

/*Hier wird das zufällige Schloss generiert. Bitte nicht veraendern sonst geht der Spaß verloren. */
void generate(void)
{
 printf ("\nSchloss wurde erstellt.\nViel Spass beim probieren.\n\n");
 unsigned int secret;
 abb = (unsigned int*) malloc (1);
 srand ( time(NULL) );
 secret = rand();
 *abb = secret;
}

/*Konvertierungsfunktion zur Ausgabe der Binaerrepraesentation einer Zahl*/
char * toBin(unsigned int num)
{
 static char retbuf[33];
 int i =0;
 for(; i<33 ; i++){
  retbuf[i]='0';
 }
 char *p;
 p = &retbuf[sizeof(retbuf)-1];
 *p = '\0';
 do {
  *--p = "0123456789abcdef"[num % 2];
  num /= 2;
 } while(num != 0);
 return retbuf;
}