lowbyte1
Goto Top

Substitution Encryption tool in C mit Microsoft Visual C-Cpp 6.0 - Visual Studio C-Cpp 2008

XOR-BASE
http://vpn23.homelinux.org


Substitution ....sehr einfach realisiert

Helo C and Kryptographie Freaks


Ich schrieb vor einiger Zeit ein ein S-encryption Tool mit dem sich Plain-Text verschlüsseln lässt.
Dieser Quelltext ist nur für Anfänger gedacht. Da das ganze viel einfacher und vorallem schneller (RUNTIME) implementiert werden kann.
Bei der Substitution handelt es sich um eine Methode der klassischen Kryptographie und ist sommit nicht mehr ganz Zeitgemäss.
Durch die sogenante Häufigkeitsanalyse oder Musteranalyse lassen sich solche Chiffrate mit ein bischen Zeit, Geduld und dem nötigen Know-How knacken.
Wobei die Substitution in einer abform wider in Modernen Methoden der kryptographie vorkommt...in zusammenhang anderer Verfahren.

Quelle:

http://de.wikipedia.org/wiki/Monoalphabetische_Substitution
http://www.geocaching.com/seek/cache_details.aspx?guid=d6482cba-6517-4d ...

Prinzip:

Die Buchstaben oder Zeichen oder auch Buchstabengruppen oder Zeichengruppen des Klartextes werden nach Vorgabe dieses einen Alphabets, das auch Schlüsselalphabet oder Geheimalphabet genannt wird, durch andere Buchstaben, Zeichen oder Gruppen ersetzt.
Klassische Beispiele für monoalphabetische Substitutionen sind die Verschiebechiffre und das Playfair-Verfahren. Im Gegensatz zur monoalphabetischen Substitutionen stehen die polyalphabetischen Substitutionen, bei denen zur Verschlüsselung mehrere (viele) verschiedene Alphabete verwendet werden. Beispiele hierfür sind die Vigenère-Verschlüsselung und die Schlüsselmaschine ENIGMA.

Ein Beispiel für eine monoalphabetische Verschlüsselung ist das folgende Verfahren. Hierbei werden einzelne Buchstaben des Klartextes mithilfe des Schlüsselalphabets in einzelne Zeichen des Geheimtextes substituiert. Diese Methode wird daher präzise als „monographische monoalphabetische monopartite Substitution“ (siehe auch: Terminologie der Kryptographie) oder schlicht auch als „einfache monoalphabetische Substitution“ bezeichnet.

Klartext: a b c d e f g h i j k l m n o p q r s t u v w x y z
Geheimtext: U F L P W D R A S J M C O N Q Y B V T E X H Z K G I

Aus dem Klartext „Wikipedia ist informativ“ wird nach Verschlüsselung der Geheimtext „ZSMSYWPSU STE SNDQVOUESH“. Der Klartext lässt sich durch Entschlüsselung wieder aus dem Geheimtext rekonstruieren, indem man dort die Buchstaben in der zweiten Zeile durch die der ersten Zeile ersetzt. Der Geheimtext, gelegentlich auch als das „Chiffrat“ bezeichnet, wird zur leichteren Unterscheidung vom Klartext zumeist mit Großbuchstaben geschrieben.

Sicherheit:

Im Gegensatz zur Cäsarchiffre mit nur 25 Möglichkeiten gibt es nun sehr viele Möglichkeiten zur Verwürfelung des Standardalphabetes: Der erste Buchstabe „A“ kann an eine von 26 mögliche Alphabetpositionen platziert werden. Für den zweiten Buchstaben „B“ gibt es dann noch 25 mögliche Plätze zur Auswahl, für den dritten 24, und so weiter. Insgesamt berechnen sich so 26·25·24·23···4·3·2·1 = 26! (Fakultät) Möglichkeiten zur Verwürfelung des Alphabets. Das sind ungefähr 4 \cdot10^{26} oder 288 Fälle und entspricht etwa 88 bit. Demzufolge ist eine Entzifferung durch simples Ausprobieren (Exhaustion) praktisch unmöglich. Dennoch ist dieses Verschlüsselungsverfahren sehr unsicher. Selbst relativ kurze Geheimtexte, die auf diese Weise verschlüsselt sind (dreißig bis fünfzig Zeichen reichen völlig aus), können mit Hilfe statistischer Untersuchungen (Häufigkeitszählungen) und durch Mustersuche entziffert werden.



Meine Implementierung unterstützt 100 Zeichen und entspricht somit 524 bit .

Ich weis das sich das ganze sicher viel einfacher realisieren lässt. auf jedenfall die "encrypt and decrypt" Funktion.
Doch es soll auch verständlich sein .. und eben für Anfänger bestens geeignet.

Der Quellcode wurde mit Visual C/C++ 6.0 getestet. Ebensom mit Visual Studio 2008 Ent.

Links für Compiler:

VS 2008 Express:
http://www.microsoft.com/express/download/default.aspx#webInstall

Eclipse:
http://www.eclipse.org/downloads/download.php?file=/technology/epp/down ...

Für die Header Datei console.h und console.c kann ich leider kein Link anbieten. Weil die Files nicht öffentlich sind soweit ich weis.
Da mir aber Dani anbot das Programm Online zu stellen denke ich das es kein Problem sein wird die Files beizupacken.
Ansonsten die Funktion cls(); mit dem Code system("cls"); ersetzen. Ein wenig unschön doch es funktioniert.

Bemerkung zum Programm: Die sogennanten S-Box können natürlich vom Benutzer beliebig verändert werden.

//=========================================================================
//
// File   : Polyalphabetische Substitution
//          Encryption Tool  524 Bit
//             
//
// Author : Lowbyte
//                           
// Create:  15.03.2008, 21:58,  Long******
//
// Project: 000*****************N	
//
//=========================================================================


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include "console.h" 

#define	EXIT	0;
#define FAILURE	1;
#define RGB_A	system("color 0a"); 
#define TITLE_	system("title Substitutions Encryption - LB  524 Bit"); 



BOOL cls();

FILE *file_ptr;
FILE *file_encrypt;

int file_size;
int menupoint;


/* Vorwärtsdeklaration der Funktionen */
int modul_main(void);
void manual(void);
void status(int *);
void status_end(void);
wint_t encryption(wint_t);
wint_t decryption(wint_t);
	


int main(void)
{
	while(1)
		{


		TITLE_;
		RGB_A;
		printf("\n\n  --   LB - Substitutions Encryption Tool   --   \n");          


		puts("\n\n");  

		printf(" [1] Encryption\n\n");  

		printf(" [2] Decryption\n\n");  

		printf(" [3] manual\n\n");  

		printf(" [4] Exit\n\n");  

		menupoint = 0;

		/* Input Menupoint */

		printf("Input:");  
		scanf("%i1", &menupoint);			  
		fflush(stdin);
	

		switch(menupoint) {

			case 1:	cls(); modul_main();
					cls();
					break;

			case 2: cls(); modul_main();
					cls();
					break;

			case 3: cls(); manual();
					cls();
					break;

			case 4:	cls();
					return EXIT;
				

				/* Fals eingabe ungültig schleife widerholen */
				default:fprintf(stderr,"falsche eingabe !!");  
				cls();
				
		}
	}
}



int modul_main(void)

	{

	/* Zeiger(Pointer) auf Stringtabellen */ 
	char *enc_str	= {"File oeffnen fuer Plain-Text Input: [copy past] or [write]",  
					   "Plain-Text wurde eingelesen ...",  
					   "Der Text kann jetz Verschluesselt werden ..."};  

	char *dec_str = {"File oeffnen fuer Encrypt-Text Input: [copy past] or [write]",  
					    "Encrypt-Text wurde eingelesen ...",  
					    "Der Text kann jetz Entschluesselt werden ..."};  

	char *ptra;
	char *ptrb;
	char *ptrc;

	char cmdstring[29] = {""};  
	char new_file[25];
	wint_t c;
	wint_t r_key;
	size_t strl;

	int count = 0;

	
			/* Input Filename */
			printf("\nName fuer die Datei angeben, die geoeffnet wird :\n\n>");  
			scanf("%24s", &new_file);  
			fflush(stdin);
			cls();

			strl = strlen(new_file);

			/* Vergleiche das 4 letzte Element des Namens auf ein . */
			if( !(new_file[strl-4] == '.')){  
				
				/* Fals nicht vorhanden kopiere die Extension hinter den Filename */
				/* und kopiere den Name in den buffer cmdstring */
				strcpy(cmdstring, new_file);
				strcat(cmdstring, ".txt");  

			} else {

				/* kopiere den Name in den Buffer cmdstring */ 
				strcpy(cmdstring, new_file);

			}

			/* öffne das File im Ascii Mode */
			file_ptr = fopen(cmdstring, "a+");  

			if(file_ptr == NULL){

					printf("\n\nFehler !! Datei konnte nicht erstellt werden ...\n\n");  
					return 1;

				} else {

					/* Schliesse den Datei(stream) */
					fclose(file_ptr);
					
					/* Encrypt or Decrypt Speicheradressen der Stringtabellen den entsprechenden Zeiger(Pointer) zuweisen */
					/* Das ist der grosse vorteil C, Zeiger(Pointer) ein zeiger auf diese adresse ?, dies ist lowlevel und zeichnet C aus. */
					/* Ansonnsten müsste eine zweite Crypt Routine geschrieben werden */
					if(menupoint == 1){
							ptra = enc_str;
							ptrb = enc_str[1];
							ptrc = enc_str[2];
						} else {
							ptra = dec_str;
							ptrb = dec_str[1];
							ptrc = dec_str[2];
					}

					printf("\n%s\n", ptra);  
					printf("Druecken Sie eine beliebige Taste . . .");  
					getchar();




					/* File öffnen für Benutzer eingabe */
					system(cmdstring);
					cls();

					printf("\n%s\n", ptrb);  
					printf("\n%s\n", ptrc);  
					printf("Druecken Sie eine beliebige Taste . . .");  
					getchar();
					cls();

				}

			/* File öffnen */
			file_ptr = fopen(cmdstring, "r");  
			
			/* Lese Zeiger des Datei(streams) auf das ende setzen */
			fseek(file_ptr, 0L, SEEK_END);

			/* File size ermitteln */
			file_size = ftell(file_ptr);
			
			rewind(file_ptr);

			/* File wird erstellt für verschlüsselten Text */
			file_encrypt = fopen("Dec-Encrypt.txt", "a+");  

			/* File wird mit der wide-char Funktion fgetwc() zeichenweise eingelesen bis WEOF eintrift */
			while( (c = fgetwc(file_ptr)) != WEOF){	
				
				/* status Output */
				status(&count);
				++count;
				
				/* Newlines werden direkt in die Datei geschrieben */
				if(c == '\n'){  

					fputwc(c, file_encrypt);

				} else {	

					if(menupoint == 1){
						/*
						   Zeichen wird der encrypt Funktion übergeben und den return Wert anschliessend in die Datei geschrieben
						   Nicht unterstützte Zeichen werden unpermutiert in die Datei geschrieben
						*/
						r_key = encryption(c);
						fputwc(r_key, file_encrypt);
					} else {
						r_key = decryption(c);
						fputwc(r_key, file_encrypt);
					}
				}
			}

		/* Crypt Complet */
		status_end();

		/* Anschliessend wird die Filsize in die Datei geschrieben */
		fprintf(file_encrypt, "\n\nSize: %iByte", file_size);	  
		
		/* Beide Files werden geschlossen */
		fclose(file_ptr);
		fclose(file_encrypt);
		return 0;
	}



/* Encryption Funktion mit der S-BOX */

wint_t encryption(wint_t o_key)
												
		{       
													
			switch(o_key) {
				
				case 32  : return 0x6C;
				case 33  : return 0x6D;
				case 34  : return 0x6E;
				case 35  : return 0x6F;
				case 36  : return 0x70;
				case 37  : return 0x71;
				case 38  : return 0x72;
				case 39  : return 0x73;
				case 40  : return 0x74;
				case 41  : return 0x75;
				case 42  : return 0x76;
				case 43  : return 0x77;
				case 44  : return 0x78;
				case 45  : return 0x79;
				case 46  : return 0x7A;
				case 47  : return 0x7B;                
				case 48  : return 0x7C;                
				case 49  : return 0x7D;                 
				case 50  : return 0x7E;                               
				case 51  : return 0xC4;                
				case 52  : return 0xD6;
				case 53  : return 0xDC;
				case 54  : return 0xE4;
				case 55  : return 0xF6;
				case 56  : return 0xFC;
				case 57  : return 0x52;
				case 58  : return 0x53;
				case 59  : return 0x54;
				case 60  : return 0x55;
				case 61  : return 0x56;
				case 62  : return 0x57;
				case 63  : return 0x58;
				case 64  : return 0x59;
				case 65  : return 0x5A;
				case 66  : return 0x5B;
				case 67  : return 0x5C;
				case 68  : return 0x5D;
				case 69  : return 0x5F;
				case 70  : return 0x60;
				case 71  : return 0x61;
				case 72  : return 0x62;
				case 73  : return 0x63;
				case 74  : return 0x64;
				case 75  : return 0x65;
				case 76  : return 0x66;
				case 77  : return 0x67;
				case 78  : return 0x68;
				case 79  : return 0x69;
				case 80  : return 0x6A;
				case 81  : return 0x6B;
				case 82  : return 0x39;
				case 83  : return 0x3A;
				case 84  : return 0x3B;
				case 85  : return 0x3C;
				case 86  : return 0x3D;
				case 87  : return 0x3E;
				case 88  : return 0x3F;
				case 89  : return 0x40;
				case 90  : return 0x41;
				case 91  : return 0x42;
				case 92  : return 0x43;
				case 93  : return 0x44;
				case 95  : return 0x45;
				case 96  : return 0x46;
				case 97  : return 0x47;
				case 98  : return 0x48;
				case 99  : return 0x49;
				case 100 : return 0x4A;
				case 101 : return 0x4B;
				case 102 : return 0x4C;
				case 103 : return 0x4D;
				case 104 : return 0x4E;
				case 105 : return 0x4F;
				case 106 : return 0x50;
				case 107 : return 0x51;
				case 108 : return 0x20;
				case 109 : return 0x21;
				case 110 : return 0x22;
				case 111 : return 0x23;
				case 112 : return 0x24;
				case 113 : return 0x25;
				case 114 : return 0x26;
				case 115 : return 0x27;
				case 116 : return 0x28;
				case 117 : return 0x29;
				case 118 : return 0x2A;
				case 119 : return 0x2B;
				case 120 : return 0x2C;
				case 121 : return 0x2D;
				case 122 : return 0x2E;
				case 123 : return 0x2F;
				case 124 : return 0x30;
				case 125 : return 0x31;
				case 126 : return 0x32;

				case 196 : return 0x33;
				case 214 : return 0x34;
				case 220 : return 0x35;
				case 228 : return 0x36;
				case 246 : return 0x37;
				case 252 : return 0x38;

				default: return o_key; 
				}

		return 0;		
}




/* Decryption Funktion mit der S-BOX */

wint_t decryption(wint_t o_key_d)		
					
		{

			switch(o_key_d) {
				
				case 108 : return 0x20;
				case 109 : return 0x21;
				case 110 : return 0x22;
				case 111 : return 0x23;
				case 112 : return 0x24;
				case 113 : return 0x25;
				case 114 : return 0x26;
				case 115 : return 0x27;
				case 116 : return 0x28;
				case 117 : return 0x29;
				case 118 : return 0x2A;
				case 119 : return 0x2B;
				case 120 : return 0x2C;
				case 121 : return 0x2D;
				case 122 : return 0x2E;
				case 123 : return 0x2F;
				case 124 : return 0x30;
				case 125 : return 0x31;
				case 126 : return 0x32;
				case 196 : return 0x33;
				case 214 : return 0x34;
				case 220 : return 0x35;
				case 228 : return 0x36;
				case 246 : return 0x37;
				case 252 : return 0x38;
				case 82  : return 0x39;
				case 83  : return 0x3A;
				case 84  : return 0x3B;
				case 85  : return 0x3C;
				case 86  : return 0x3D;
				case 87  : return 0x3E;
				case 88  : return 0x3F;
				case 89  : return 0x40;
				case 90  : return 0x41;
				case 91  : return 0x42;
				case 92  : return 0x43;
				case 93  : return 0x44;
				case 95  : return 0x45;
				case 96  : return 0x46;
				case 97  : return 0x47;
				case 98  : return 0x48;
				case 99  : return 0x49;
				case 100 : return 0x4A;
				case 101 : return 0x4B;
				case 102 : return 0x4C;
				case 103 : return 0x4D;
				case 104 : return 0x4E;
				case 105 : return 0x4F;
				case 106 : return 0x50;
				case 107 : return 0x51;
				case 57  : return 0x52;
				case 58  : return 0x53;
				case 59  : return 0x54;
				case 60  : return 0x55;
				case 61  : return 0x56;
				case 62  : return 0x57;
				case 63  : return 0x58;
				case 64  : return 0x59;
				case 65  : return 0x5A;
				case 66  : return 0x5B;
				case 67  : return 0x5C;
				case 68  : return 0x5D;
				case 69  : return 0x5F;
				case 70  : return 0x60;
				case 71  : return 0x61;
				case 72  : return 0x62;
				case 73  : return 0x63;
				case 74  : return 0x64;
				case 75  : return 0x65;
				case 76  : return 0x66;
				case 77  : return 0x67;
				case 78  : return 0x68;
				case 79  : return 0x69;
				case 80  : return 0x6A;
				case 81  : return 0x6B;
				case 32  : return 0x6C;
				case 33  : return 0x6D;
				case 34  : return 0x6E;
				case 35  : return 0x6F;
				case 36  : return 0x70;
				case 37  : return 0x71;
				case 38  : return 0x72;
				case 39  : return 0x73;
				case 40  : return 0x74;
				case 41  : return 0x75;
				case 42  : return 0x76;
				case 43  : return 0x77;
				case 44  : return 0x78;
				case 45  : return 0x79;
				case 46  : return 0x7A;
				case 47  : return 0x7B;
				case 48  : return 0x7C;
				case 49  : return 0x7D;
				case 50  : return 0x7E;

				case 51  : return 0xC4;
				case 52  : return 0xD6;
				case 53  : return 0xDC;
				case 54  : return 0xE4;
				case 55  : return 0xF6;
				case 56  : return 0xFC;

				  default: return o_key_d;
			}

		return 0;
			
	}





void status(int *counter)
		{ 

			printf(" ________________________________________________ \n");  
			printf("						  \n");  
			printf("             0x%o               %i                \n", *counter, *counter);  
			printf("						  \n");  
			printf(" ________________________________________________ \n");  

			cls();
		}

void status_end(void)
		{	
			printf(" ________________________________________________ \n");  
			printf("                                                  \n");  
			printf("             Encryption Complete !                \n");  
			printf(" ________________________________________________ \n");  
			
			getchar();
			cls();			
		}




void manual(void)
		{
			printf("manual\n\n");  
			getchar();
		}



lowbyte

Content-Key: 103987

Url: https://administrator.de/contentid/103987

Printed on: April 24, 2024 at 04:04 o'clock

Member: Dani
Dani Dec 13, 2008 at 16:07:51 (UTC)
Goto Top
Hi lowbyte,
ein paar Dinge vermisse ich:
  • Das hier soll doch eine Anleitung sein, da sei bitte so nett und wende die Groß- & Kleinschreibung an. Denn a) es eine Art "Vorbild" gegenüber den Beiträgen sein und b) es ghört sich einfach. Die Zeit sollte man vllt. haben, wenn man hier ein Tutorial einstellt.

  • Was mir auch ein bisschen aufstößt ist, dass du keinerlei Kommentare o. Vermerke in einem kl. Programm mit 485 Zeilen geschrieben hast. Jemand der gerne etwas verändern möchte, hat a) keine Chance oder b) sehr viel Zeit zu investieren. Wenn ich sowas zur Verfügung stelle, dann doch so das man nicht relativ wenig Zeit was erzielen kann.

  • Des Weiteren finde ich deine Definition "Substitution Encryption tool in C" ein bisschen ungenau. Von welchen C reden wir denn hier nun? Borland oder Micosoft...du musst dir denken, dass nicht jeder so viel Ahnung hat wie du und noch ein paar hier und das am Quellcode erkennen. Sprich vllt. auch dann entsprechend einen Downloadlink bereitstellen.

Ich fände es nicht schlecht, wenn man auch gleich das Programm downloaden könnte. Sprich du könntest mir einfach die EXE + 'Sourcedateien im ZIP Archiv zukommen lassen und ich sorge dafür, dass diese in deiner Anleitung als Download bereitstehen.


Gruss,
Dani
Member: lowbyte1
lowbyte1 Dec 13, 2008 at 16:56:12 (UTC)
Goto Top
Helo Dani

Vielen Dank für die Kritik.
Von nun an werde ich auf die gross und klein Schreibung achten.
Den Source Code werde ich natürlich mit Comments versehen, ein Fehler von mir sorry.
Und das Tutorial ein wenig überarbeiten.
Die *.exe kann ich dir gerne zukommen lassen. Email?


lowbyte