Version:0.9 StartHTML:0000000105 EndHTML:0000009793 StartFragment:0000000152 EndFragment:0000009759
/*  	Code source pour crypter selon la méthode de Mauborgne

	Cet algorithme utilise le principe de masque jetable. Le masque jetable est 
	le seul algorithme de cryptage connu comme étant indécryptable. C'est en fait 
	un chiffre de Vigenère avec comme caractéristique que la clef de chiffrement 
	a la même longueur que le message clair. Le système du masque jetable fut 
	inventé par Gilbert Vernam en 1917, puis perfectionné par le major Joseph O. 
	Mauborgne en 1918, qui inventa le concept de clef aléatoire.
	
	
	L'entrée est une chaine de caractère converti en binaire
	en suivant la table ASCII
	
	La clé est générée aléatoirement par le système
	
	Pour crypter, on effectue un XOR entre la chaine de caractère et la clé
	tout deux en binaires.
	
	Pour décrypter on effectue la même opération que pour le cryptage

    */



//FICHIER Definition pui()

#include <stdio.h>

int pui2 (int b) //fonction puissance, b est l'exposant
{
	int k,p;
	//b=0 signifie que le résultat sera 1 quoi qu'il advienne
	if (b != 0 ){
		for (k=1;k<b;k++){
			p = 2 << k; //décalage de 1 bit vers la gauche soit multiplication par 2
		}
	}
	else p = 1;
		return p;// la fonction retourne p soit le résultat du calcul de la puissance
}

//FICHIER Principal main()

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define LONG_MOT 100

int pui2 (int); //pour dire à main qu'il utiliser la fonction pui2 -> le prototype

main()
	 //Chiffrement avec la propriété XOR
{
	char texte [LONG_MOT]; //tableau de caractère de longueur LONG_MOT
	int j, k, div, tmp;
	int rndValue; //variable de création de la clé aléatoire
	int texbin [100] [8], texte2[100][8], cle [100] [8]; //tableaux pour le texte crypté, le texte décrypté et la clé
	
	SetConsoleTitle("Chiffrement XOR");
	
	srand(time(NULL)); //initialisation du générateur de nombres aléatoires à partir de l'horloge du système
	
	printf("Texte en Clair (Sans Accent) : ");
	
	fgets(texte,sizeof texte,stdin);  //récupére la ligne dans le fichier spécifié 
	
	//
	//conversion du texte clair en binaire
	//
	for (j=0;j<strlen(texte)-1;j++) //boucle qui s'arréte un caractère avant la fin de la ligne, soit juste avant le retour chariot
	{
		tmp = texte [j]; 
		for (k=7;k>=0;k--)
		{                        
			div = tmp >> k;  //on décale "tmp" de "k" à droite et on renvoie le bit le plus faible dans "div"
			
			/*le bit dans "div" est stocké dans un tableau de taille 8*LONG_MOT*/
			if ( div == 1 ){
				texbin [j] [7-k] = 1;
                		tmp = tmp%pui2(k);
			}
			else
			{
				texbin [j] [7-k] = 0;
			}
		}
	}
	
	//Affichage du texte clair transcrit en binaire
	
	printf("Texte en Clair Code Binaire :    ");
	for (j=0;j<strlen(texte)-1;j++){
		for (k=0;k<8;k++){
			printf("%d", texbin [j] [k] );
       	}
	}
	printf("\n");
	printf("\n");
	
	//Creation de la clé aléatoire en binaire
	
	printf("Cle Binaire Pseudo-Aleatoire :   ");
	for (j=0;j<strlen(texte)-1;j++){
		for (k=0;k<8;k++){
			cle [j] [k] = rand() % 2; 
			printf("%d", cle [j] [k]);
  		}
	}
	printf("\n");
	printf("\n");
	
	
	/*Chiffrement du texte en binaire via la clé - Operateur XOR
	  ^   : OU exclusif bit à bit entre les valeurs de 2 expressions.
        a ^ b :chaque bit du résultat vaut 1 si les bits de même rang de a et b sont différents, 0 sinon. 

	Table de vérité des opérateurs bit à bit :

	a 	b	a ^ b
	0 	0	  0
	0 	1	  1
	1 	0	  1
	1 	1	  0
	
	*/
	
	printf("Texte Crypte en Binaire (XOR) :  ");
	for (j=0;j<strlen(texte)-1;j++){
		for (k=0;k<8;k++){
			texbin [j] [k] = texbin [j] [k] ^ cle [j] [k]; 
			printf("%d", texbin [j] [k] );
		}
	}


	printf("\n");
	printf("\n");

    /* 
    	METHODE AJOUTEE POUR LA DEMONSTRATION DU DECHIFFREMENT
	-------------------------------------------------------------------
    	Decryptage du texte crypté
       On effectue un XOR avec la meme clé sur le texte crypté précédemment
       et on retombe sur le texte clair
       
    */
	printf("Decryptage du texte :            ");
	for (j=0;j<strlen(texte)-1;j++){
		for (k=0;k<8;k++){
			texte2 [j] [k] = texbin [j] [k] ^ cle [j] [k];
			printf("%d", texte2 [j] [k] );
		}
	}
	
    printf("\n");
	printf("\n");
	system("PAUSE");
}