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/Musterlösung: Unterschied zwischen den Versionen

K
Zeile 1: Zeile 1:
#include <stdio.h>
+
<pre>
#include <stdlib.h>
+
#include <stdio.h>
#include <time.h>
+
#include <stdlib.h>
+
#include <time.h>
unsigned int* abb;
+
 
unsigned int versuche = 0;
+
unsigned int* abb;
+
unsigned int versuche = 0;
void generate(void);
+
 
int test(unsigned int);
+
void generate(void);
char * toBin(unsigned int);
+
int test(unsigned int);
unsigned int switchBit(int,int);
+
char * toBin(unsigned int);
+
unsigned int switchBit(int key, int whichBit);
int main (void)
+
 
{
+
int main (void)
  generate();
+
{
  unsigned int key = 0;
+
generate();
  /* ab hier kannst du versuchen die Tuer mit deinem Schluessel zuknacken.
+
unsigned int key = 0;
  veraendere die Variable Key dazu mit den dir bekannten bitweisen Operatoren
+
/* Ab hier kannst du versuchen die Tür mit deinem Schlüssel zu knacken.
  die du in der Vorlesung kennengelernt hast.
+
Verändere die Variable "Key" mit den dir bekannten bitweisen Operatoren,
  Du kannst deinen Schluessel dann mit der Funktion test() mit deinem Schluessel
+
die du in der Vorlesung kennengelernt hast.
  als Parameter testen.
+
Du kannst deinen Schlüssel dann mit der Funktion test() überprüfen,
  */
+
welcher als Parameter übergeben wird.
  int i = 0;
+
Bitte beachte, dass sowohl Schlüssel als auch Schloss unsigned Integer sind.
  for(; i < 32 ; i++){/* fuer jedes Bit wird geprueft ob es Richtig ist oder ob es getaucht werden muss*/
+
*/
  int rightBits  = test(key);/* Anzahl der richtigen Bits bevor das i-te Bit getauscht wurde*/
+
  int newRightBits = test(switchBit(key,i));/* Anzahl der richtigen Bits nachdem das i-te Bit getauscht wurde*/
+
int i = 0;
  if(newRightBits > rightBits)
+
for(; i < 32 ; i++){/* für jedes Bit wird geprüft ob es richtig ist oder ob es getaucht werden muss*/
    /* wenn die Anzahl der richtigen Bits nach dem Tausch groeßer ist als vorher
+
int rightBits  = test(key);/* Anzahl der richtigen Bits bevor das i-te Bit getauscht wurde*/
    ist der Schluessel mit dem getauschten bit der Neue Schluessel*/
+
int newRightBits = test(switchBit(key,i));/* Anzahl der richtigen Bits nachdem das i-te Bit getauscht wurde*/
    key=switchBit(key,i);
+
if(newRightBits > rightBits)
  }
+
/* Wenn die Anzahl der richtigen Bits nach dem Tausch größer ist als vorher,
return 0;
+
ist der Schluessel mit dem getauschten Bit der neue Schlüssel*/
}
+
key=switchBit(key,i);
+
}
/*Diese Funktion vertaucht das in whichBit uebgebene Bit in dem uebergebenen Schluessel
+
  und liefert den so veraenderten Schluessel als Rueckgabewert*/
+
return 0;
unsigned int switchBit(int key , int whichBit)
+
}
{
+
 
  return key ^ (1<<whichBit);
+
/*Diese Funktion vertaucht das in whichBit übgebene Bit in dem übergebenen Schlüssel
}
+
  und liefert den so veränderten Schlüssel als Rückgabewert*/
+
unsigned int switchBit(int key , int whichBit)
/* diese Funktion liefert die Anzahl der Richtigen Bits im uebergebenen Schluessel zurueck.
+
{
  falls 32 zurueckgeliefert wird war der Schluessel richtig und die Tuer oeffnet sich.
+
return key ^ (1<<whichBit);
 +
}
 +
 
 +
/* Diese Funktion liefert die Anzahl der richtigen Bits des übergebenen Schlüssels zurück.
 +
  Falls 32 zurückgeliefert wird, war der Schlüssel richtig und die Tür öffnet sich.
 
  */
 
  */
int test(unsigned int toTest)
+
int test(unsigned int toTest)
{
+
{
int rightBits = 0;
+
int rightBits = 0;
int i = 0;
+
int i = 0;
for(; i< 32 ; i++){
+
for(; i< 32 ; i++){
  unsigned int x = 1 << i;
+
unsigned int x = 1 << i;
  if(! ~((toTest & x) ^ (*abb| ~x))){
+
if(! ~((toTest & x) ^ (*abb| ~x))){
  rightBits++;
+
rightBits++;
  }
+
}
}
+
}
if(rightBits == 32){
+
if(rightBits == 32){
  printf ("\nGratulation !\n\n");
+
printf ("\nGratulation !\n\n");
  printf ("Die Tuer ist offen.\n");
+
printf ("Die Tuer ist offen.\n");
  printf ("So sahen Schluessel und Schloss aus \n");
+
printf ("So sahen Schluessel und Schloss aus \n");
  printf ("Schloss    : %32s \n", toBin(*abb));
+
printf ("Schloss    : %32s \n", toBin(*abb));
  printf ("Schluessel : %32s \n", toBin(~*abb));
+
printf ("Schluessel : %32s \n", toBin(~*abb));
  exit(0);
+
exit(0);
}else{
+
}else{
  printf ("%3d . Versuch, %d richtige Bits \n", ++versuche, rightBits);
+
printf ("%d . Versuch, %d richtige Bits \n", ++versuche, rightBits);
  return rightBits;
+
return rightBits;
}
+
}
}
+
}
+
 
/*Hier wird das zufaellige Schloss generiert. Bitte nicht veraendern sonst geht der Spaß verloren. */
+
/*Hier wird das zufällige Schloss generiert. Bitte nicht veraendern sonst geht der Spaß verloren. */
void generate(void)
+
void generate(void)
{
+
{
  printf ("\nSchloss wurde erstellt.\nViel Spass beim probieren.\n\n");
+
printf ("\nSchloss wurde erstellt.\nViel Spass beim probieren.\n\n");
  unsigned int secret;
+
unsigned int secret;
  abb = (unsigned int*) malloc (1);
+
abb = (unsigned int*) malloc (1);
  srand ( time(NULL) );
+
srand ( time(NULL) );
  secret = rand();
+
secret = rand();
  *abb = secret;
+
*abb = secret;
}
+
}
+
 
/*Konvertierungsfunktion zur Ausgabe der Binaerrepraesentation einer Zahl*/
+
/*Konvertierungsfunktion zur Ausgabe der Binaerrepraesentation einer Zahl*/
char * toBin(unsigned int num)
+
char * toBin(unsigned int num)
{
+
{
  static char retbuf[33];
+
static char retbuf[33];
  int i =0;
+
int i =0;
  for(; i<33 ; i++){
+
for(; i<33 ; i++){
  retbuf[i]='0';
+
retbuf[i]='0';
  }
+
}
  char *p;
+
char *p;
  p = &retbuf[sizeof(retbuf)-1];
+
p = &retbuf[sizeof(retbuf)-1];
  *p = '\0';
+
*p = '\0';
  do {
+
do {
  *--p = "0123456789abcdef"[num % 2];
+
*--p = "0123456789abcdef"[num % 2];
  num /= 2;
+
num /= 2;
  } while(num != 0);
+
} while(num != 0);
  return retbuf;
+
return retbuf;
}
+
}
 +
</pre>

Version vom 8. September 2010, 19:54 Uhr

#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);
unsigned int switchBit(int key, int whichBit);

int main (void)
{
	generate();
	unsigned int key = 0;
	/* Ab hier kannst du versuchen die Tür mit deinem Schlüssel zu knacken.
	 Verändere die Variable "Key" mit den dir bekannten bitweisen Operatoren,
	 die du in der Vorlesung kennengelernt hast.
	 Du kannst deinen Schlüssel dann mit der Funktion test() überprüfen, 
	 welcher als Parameter übergeben wird.
	 Bitte beachte, dass sowohl Schlüssel als auch Schloss unsigned Integer sind.
	 */
	
	int i = 0;
	for(; i < 32 ; i++){/* für jedes Bit wird geprüft ob es richtig ist oder ob es getaucht werden muss*/
		int rightBits  = test(key);/* Anzahl der richtigen Bits bevor das i-te Bit getauscht wurde*/
		int newRightBits = test(switchBit(key,i));/* Anzahl der richtigen Bits nachdem das i-te Bit getauscht wurde*/
		if(newRightBits > rightBits)
		/* Wenn die Anzahl der richtigen Bits nach dem Tausch größer ist als vorher,
		 ist der Schluessel mit dem getauschten Bit der neue Schlüssel*/
			key=switchBit(key,i);
	}
	
	return 0;
}

/*Diese Funktion vertaucht das in whichBit übgebene Bit in dem übergebenen Schlüssel
 und liefert den so veränderten Schlüssel als Rückgabewert*/
unsigned int switchBit(int key , int whichBit)
{
	return key ^ (1<<whichBit);
}

/* Diese Funktion liefert die Anzahl der richtigen Bits des übergebenen Schlüssels 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;
}