Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ecriture "protégée" dans un fichier texte

9 réponses
Avatar
Michael
Bonjour à tous,

je voudrais écrire une chaine de caractères dans un fichier texte, mais
sans que l'on puisse voir ce qui a été écrit dedans avec le bloc notes
par exemple...

L'idée que j'ai eu est la suivante:

opérer un décalage sur les caractères qu'on veut mettre dans le fichier
texte:

ofstream fileout;
char c;

fileout.open(nom_out,ios::out | ios::binary);

while (//...
{
c << 1;
fileout << c;
}

fileout.close();

Et là effectivement je n'ai plus des caractères dans le fichier mais une
succession de chiffres...

Seulement lorsque je veux lire ce qui est écrit dans le fichier, le
décalage dans l'autre sens ne fonctionne pas (j'imagine que c'est normal,
mais je ne sais pas pourquoi)

Comment je peux faire ce "cryptage" de ma chaine de caractères?

Merci d'avance

Mike

9 réponses

Avatar
Pierre Maurette
Michael a écrit:

Bonjour à tous,

je voudrais écrire une chaine de caractères dans un fichier texte, mais
sans que l'on puisse voir ce qui a été écrit dedans avec le bloc notes
par exemple...

L'idée que j'ai eu est la suivante:

opérer un décalage sur les caractères qu'on veut mettre dans le fichier
texte:

ofstream fileout;
char c;

fileout.open(nom_out,ios::out | ios::binary);

while (//...
{
c << 1;
fileout << c;
}

fileout.close();

Et là effectivement je n'ai plus des caractères dans le fichier mais une
succession de chiffres...

Seulement lorsque je veux lire ce qui est écrit dans le fichier, le
décalage dans l'autre sens ne fonctionne pas (j'imagine que c'est normal,
mais je ne sais pas pourquoi)
Sur de l'ascii vrai (char 8 bits, bit 7 à 0) ça pourrait marcher, mais

en déclarant ou en transtypant c en unsigned.


Comment je peux faire ce "cryptage" de ma chaine de caractères?
Je tiens compte de vos guillemets, et considère que vous ne cherchez

pas à ce que votre cryptage résiste plus que quelques minutes. Deux
voies: dans le même ordre d'idée que votre décalage, un OU EXCLUSIF
qui a l'avantage de crypter et décrypter avec la même opération:
#define CODE 'M'
c ^= CODE;
N'importe quelle valeur de char convient pour CODE, il suffit
d'utiliser le même à l'écriture et à la lecture. Le texte est à sauver
en tant que binaire une fois "crypté".
Vous pouvez également chercher "rot13" sur Google (ce n'est pas du
cryptage, mais du masquage de lecture). L'avantage, c'est que sauf
erreur de ma part ça reste du texte, le problème c'est que ça se
reconnaît à loeil, et que tous les lecteurs de news le déchiffrent.
--
Pïerre

Avatar
Arnaud Meurgues
Michael wrote:

while (//...
{
c << 1;
fileout << c;
}
Seulement lorsque je veux lire ce qui est écrit dans le fichier, le
décalage dans l'autre sens ne fonctionne pas (j'imagine que c'est normal,
mais je ne sais pas pourquoi)


C'est assez normal, effectivement : en décalant, on « pousse dehors » le
bit de poids fort qui pouvait être 0 ou 1. Or il n'y a aucun moyen de
savoir duquel il s'agissait avant décalage. Donc on ne peut pas
retrouver le caractère originel (on a toujours un choix de deux
caractères, un avec 0 comme bit de poids fort et l'autre avec un 1).

--
Arnaud
(Supprimez les geneurs pour me répondre)

Avatar
Andre Heinen
On 17 Nov 2004 13:35:12 GMT, Michael wrote:

Comment je peux faire ce "cryptage" de ma chaine de caractères?


La solution la plus simple est certainement celle de Pierre. Si,
cependant, tu préfères garder l'idée de décalage, tu peux
récupérer (avant décalage) le bit de poids fort, et ensuite
(après décalage) le remettre à la place du bit de poids faible.
Comme ça, tu pourras le restaurer. Voir les opérateurs & et |.

Tu t'exposes cependant à des problèmes de portabilité. Tout
d'abord, c<<1 a un comportement indéterminé si c est signé et si
son bit de poids fort est à 1: tu dois donc utiliser des unsigned
char. Pour convertir tes char en unsigned char, une conversion
explicite est préférable à une conversion implicite. Ensuite,
lorsque tu récupéreras le bit de poids fort, pense que tu n'as
pas de garantie qu'un caractère soit codé sur 8 bits. Par
exemple, c&128 est une mauvaise solution. Pour connaître le
nombre de bits, voir numeric_limits<char>. (Et pour rappel, rien
ne sert de tester sizeof(char).)

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz

Avatar
Pierre Maurette
Andre Heinen a écrit:

On 17 Nov 2004 13:35:12 GMT, Michael wrote:

Comment je peux faire ce "cryptage" de ma chaine de caractères?


La solution la plus simple est certainement celle de Pierre. Si,
cependant, tu préfères garder l'idée de décalage, tu peux
récupérer (avant décalage) le bit de poids fort, et ensuite
(après décalage) le remettre à la place du bit de poids faible.
Comme ça, tu pourras le restaurer. Voir les opérateurs & et |.

Tu t'exposes cependant à des problèmes de portabilité.
Tant qu'à faire dans le non portable jovial ;-) (en x86):

#define DECALAGE 3
/* bla bla*/
char c = 'A';
__asm ror c, DECALAGE /* crypte */

__asm rol c, DECALAGE /* décrypte */


Le XOR sur 1 char est vraiment trop simple (on voit les lettres
doubles, par exemple). On pourrait essayer:
tab[0] ^= CODE;
for(i = 1; i < tailleTotale; ++i) tab[i] ^= tab[i - 1];
(même code cryptage et décryptage).
--
Pierre


Avatar
Fabien LE LEZ
On 17 Nov 2004 13:35:12 GMT, Michael :

je voudrais écrire une chaine de caractères dans un fichier texte, mais
sans que l'on puisse voir ce qui a été écrit dedans avec le bloc notes
par exemple...


Un petit cryptage DES serait peut-être pas mal : efficace (tant que la
clé reste secrète bien sûr), facile à implémenter, et rapide.


--
;-)

Avatar
Michael
Un petit cryptage DES serait peut-être pas mal : efficace (tant que la
clé reste secrète bien sûr), facile à implémenter, et rapide.


Tu n'aurais pas un exemple de code de cryptage DES?

Je ne trouve rien sur le net pour le moment...

Avatar
Fabien LE LEZ
On 17 Nov 2004 20:38:11 GMT, Michael :

Tu n'aurais pas un exemple de code de cryptage DES?


Euh... Je peux essayer de retrouver des bouts de code, mais je ne
garantis rien.

Je ne trouve rien sur le net pour le moment...


Tu as déjà fini d'explorer les 69500 liens que donne Google ? :-o
<http://www.google.com/search?hl=en&lr=&qÞs+encryption+%22c%2B%2B%22&btnG=Search&gt;


--
;-)

Avatar
Fabien LE LEZ
On 17 Nov 2004 20:38:11 GMT, Michael :

Tu n'aurais pas un exemple de code de cryptage DES?


<http://perso.edulang.com/cryptage_des.zip&gt;
Contenu non garanti.
Note : il me semble que DES n'offre qu'une sécurité assez moyenne, un
peu comme MD5. Mais j'imagine que tu n'en demandes pas plus.


--
;-)

Avatar
kanze
Michael wrote in message
news:<419b5390$0$6413$...

je voudrais écrire une chaine de caractères dans un fichier texte,
mais sans que l'on puisse voir ce qui a été écrit dedans avec le bloc
notes par exemple...

L'idée que j'ai eu est la suivante:

opérer un décalage sur les caractères qu'on veut mettre dans le
fichier texte:

ofstream fileout;
char c;

fileout.open(nom_out,ios::out | ios::binary);

while (//...
{
c << 1;
fileout << c;
}

fileout.close();

Et là effectivement je n'ai plus des caractères dans le fichier mais
une succession de chiffres...

Seulement lorsque je veux lire ce qui est écrit dans le fichier, le
décalage dans l'autre sens ne fonctionne pas (j'imagine que c'est
normal, mais je ne sais pas pourquoi)

Comment je peux faire ce "cryptage" de ma chaine de caractères?


Sans savoir le but véritable, c'est quasiment impossible à suggérer une
bonne solution. Si le but, c'est seulement d'empécher une lecture
accidentelle (un « spoiler », ou du texte qui risque d'offenser), rot13
est sans doute ce qu'il y a de plus facile. Si on veut un peu de
sécurité, mais qu'on n'est pas géner par le fait que n'importe qui, avec
un peu d'effort, pourrait décrypter, un xor sur la chaîne est ce qu'il y
a du plus simple : si on tient à ce que le résultat soit aussi des
« caractères », on peut y ajouter quelque chose comme base64 ou uuencode
sur le résultat, et pour un peu plus de sécurité, on peut faire varier
le valeur qui sert dans l'xor. (Initialise un générateur connu de
nombres aléatoire, puis se sert d'une nouvelle valeur chaque fois, par
exemple.)

Au délà, il y a des solutions plus compliquées, avec DES ou PGP, mais
même dans ces cas, il ne faut pas oublier la possibilité de simplement
désassembler ton code pour y trouver la clé. Si tu n'es pas protégé
contre cette possibilité, ce n'est pas la peine d'être trop compliqué.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34