Codage d'un fichier texte avec c++

cs_mame06 Messages postés 5 Date d'inscription samedi 23 janvier 2010 Statut Membre Dernière intervention 2 février 2010 - 29 janv. 2010 à 22:50
cs_mame06 Messages postés 5 Date d'inscription samedi 23 janvier 2010 Statut Membre Dernière intervention 2 février 2010 - 2 févr. 2010 à 15:32
salut tout le monde voilà je dois crypter et décrypter un fichier texte en c++ et mon grand probleme c'est que je suis débutante en c++.

alors j'ai déjà une fonction qui permet d'ouvrir de lire et de fermer un fichier texte tout ce que j'ai pas compris c'est comment faire le cryptage et le décryptage .ou bien s'il y'a des fonctions en c++ qui renvoient le code ascii en binaire des carateres.

bon je mets le description du probleme en cas où quelqu'un pourrait m'aider.




- Éditer (avec un éditeur de textes) un texte quelconque de quelques lignes et enregistrer ce fichier sur le disque.
- Créer un programme qui lit ce fichier et affiche son contenu. Le programme affichera finalement le nombre de lignes composant le fichier.



II. Cryptage d'un fichier
On se propose de crypter de manière simple le fichier précédemment créé (afin d'en interdire la lecture avec un simple éditeur de textes).

1. Faire la fonction de cryptage
L'octet transmis sera divisé en deux quartets. Les bits des quartets seront ensuite mélangés comme indiqué ci-dessous. La fonction retournera le complément du résultat obtenu.
Exemple : Soit le caractère 'A' de code ASCII 0x41
On coupe ce code ASCII en deux quartets ; on obtient 4 et 1, soit en binaire : 0100 et 0001.
On mélange les quartets en alternant les bits dans cet ordre:
4 8 3 7 2 6 1 5
On obtient alors un octet contenant 0x48, soit, en binaire : 01001000
Ensuite on prend le complément de cette valeur et on obtient 10110111, soit en hexadécimal 0xB7.
Si le caractère 'A' est transmis à la fonction, celle-ci retournera donc la valeur B7H (soit 183 en décimal).


2. Écrire une fonction réalisant la lecture du fichier Fin, qui crypte ce fichier et écrit le résultat dans Fout.
- Le prototype de cette fonction sera :
int CryptFile(FILE *Fin, FILE *Fout);
Cette fonction retournera 1 si le cryptage s'est bien passé, et 0 en cas d'erreur.
Remarque : Le fichier Fout devra avoir été ouvert en binaire pour assurer une écriture correcte dans le fichier.


3. Faire le programme complet.
L'utilisateur devra entrer le nom du fichier à crypter et le nom du fichier crypté.
Proposer un système permettant de crypter ou décrypter de manière automatique le fichier transmis en argument.



merci d'avance.

4 réponses

tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
31 janv. 2010 à 16:45
Salut,

C'est un peu long, on dirait que tu donnes le sujet d'un devoir maison sans y avoir réfléchi.

Qu'as-tu fait et quelle est la question qui te bloques (c'est là qu'on intervient d'habitude)

thip
0
cs_mame06 Messages postés 5 Date d'inscription samedi 23 janvier 2010 Statut Membre Dernière intervention 2 février 2010
31 janv. 2010 à 22:07
C vrai tu as raison c'est un devoir maison mais j'y réflechissais au moment de le poster d'ailleurs je suis parvenu à trouver une méthode pour renvoyer le complémentaire et la fonction de cryptage c'est pas très original mais tout ce que j'ai trouvé jusque là elles marchent bien(je les ai testé).si vous avez des remarques merci de bien vouloir les poster:


la méthode qui renvoit le complémentaire:

int comp(unsigned char uce)
{
int com;
int codeascii = uce;
int a,b,i;
a=codeascii/2;
b=codeascii%2;
i=7;
TB[i]=b;
while (a!=0)
{ TB[i]=b;
codeascii=a;
a=codeascii/2;
b=codeascii%2;
i--;
}

TB[i]=b;
for(int k=i-1;k>=0;k--)
{
TB[k]=0;
}
A[0]=TB[3];A[1]=TB[7];A[2]=TB[2];A[3]=TB[6];A[4]=TB[1];A[5]=TB[5];A[6]=TB[0];A[7]=TB[4];cout <<endl;
com=0;
for (int j=0;j<8;j++)
{
TB[j]=A[j];
if (TB[j]==0)
TB[j]=1;
else
TB[j]=0;

}
com=0;
for (int j=0;j<8;j++)
{

com=com+TB[j]*pow(2,(7-j));
}
return com;
}





la fonction de cryptage:
int CryptFile(string fin, string fout)//la fonction de crypatge
{
fstream fichier(fin.c_str(),ios::in);
fstream dest(fout.c_str(),ios::out);
int k;
int j=0;
char caractere;
unsigned char ca;
if(fichier)
{
if (dest)
{
while(!fichier.eof()) // tant que l'on est pas à la fin du fichier
{
fichier.get(caractere);
k=comp(caractere);
ca=k;
dest<<ca;
}

dest.close();
j=1;
}
else
{
cerr << "Impossible d'ouvrir le fichier de destination !" << endl;
fichier.close();
}
}
else
cerr << "Impossible d'ouvrir le fichier source !" << endl;

return j;
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
1 févr. 2010 à 10:48
Bonjour,
Si ça fonctionne, tout va bien.

Tu pourrais utiliser les opérateurs sur les bits
complémentaire(x) : (~x & 0xff)
valeur du bit i de x : (x & (1<> i


thip
0
cs_mame06 Messages postés 5 Date d'inscription samedi 23 janvier 2010 Statut Membre Dernière intervention 2 février 2010
2 févr. 2010 à 15:32
salut,comme g dit plus haut la fct que j'ai faite marche très bien mais mon seul soucis c'est que les paramètres sont de type string (les noms des fichiers) int CryptFile(string fin, string fout) alors que le prototype de la fonction est:
int CryptFile(FILE *Fin, FILE *Fout); j'ai essayé ça mais y'a un message d'erreur qui dit que le type file n'existe pas alors je ne sais pas trop comment faire ou bien s'il y'a une biblio à inclure.
mon deuxième problème c'est comment ouvrir mon fichier dans lequel je dois écrire en mode binaire et ceci en c++.merci de bien vouloir me donner un coup de main.
0
Rejoignez-nous