Cryptage XOR d'une chaine : pbm de caractères NULL

Cryptage XOR d'une chaine : pbm de caractères NULL - Delphi/Pascal - Programmation

Marsh Posté le 11-04-2006 à 17:40:11    

Bonjour,
 
Voilà, j'ai une fonction qui, à partir deux chaines (une servant de "clé" de codage et l'autre étant la chaîne à coder), renvoie une chaine cryptée. Le fonctionnement est ultra simple puisqu'il s'agit d'une opération XOR entre le code ASCII d'un caractère de ma clé et le code ASCII d'un caractère de la chaine à crypter (répété n fois, n étant la longueur de la chaine à crypter). Les deux chaines peuvent contenir n'importe quel caractère. Le soucis est que lorsque deux caractères sont identiques le résultat de l'opération XOR vaut 0x0. Ca ne pose pas de problème particulier tant que je travaille avec des String. Sauf que je suis obligé à un moment de passer ma chaine cryptée à une fonction externe prenant en paramètre un PChar. Si ma chaine cryptée contient en plein milieu un caractère NULL je me retrouve avec une chaine tronquée :/ (ce qui est logique puisque un caractère NULL représente une fin de chaine).
 
Etant donné que je ne peux pas changer la fonction externe, ma chaine cryptée ne doit donc PAS contenir de caractères NULL. Mes deux chaines de départ pouvant contenir n'importe quel caractère je ne peux éviter qu'à un moment donné je fasse une opération sur deux caractères identiques. Il faut donc que je traite de manière spécifique ce cas là ... mais quoi faire ? Bien entendu, je dois être capable par la suite de décoder ma chaine.
 
Je ne sais pas si j'ai été ultra clair :o En tout cas si quelqu'un a une idée, merci d'avance :jap:
 
:hello:


---------------
"I'm as mad as hell and I'm not going to take this anymore !"
Reply

Marsh Posté le 11-04-2006 à 17:40:11   

Reply

Marsh Posté le 11-04-2006 à 19:33:01    

Apparament, il y a une "la fonction externe" qui constitue une contrainte. Je crois comprendre, sans en être sûr, que cette fonction prend en entrée la chaine cryptée qu'on lui passe, et que cette chaîne doit être terminée par un caractère nul.
Si c'est bien cela, alors, je vois les solutions suivantes :
 
1. Soit, remplacer les caratères nuls de milieu de chaîne par un autre caractère qui n'est jamais utilisé, par exemple le caractère 1/2, ou le point d'exclamation à l'envers des textes espagnols, ou le caractère de code 255.
Faire ce remplacement tout au début du cryptage, et dans l'autre sens tout à la fin du décryptage.
 
2. Soit, remplacer les caratères nuls de milieu de chaîne par un ensemble de plusieurs caractères qui ne sont  jamais utilisés, par exemple <<<null>>>.
Faire ce remplacement tout au début du cryptage, et dans l'autre sens tout à la fin du décryptage.
 
3. Remplacer d'abord tous les caractères par leur valeur hexadécimale, par exemple "AA\0BC" devient "6161006263".
Faire ce remplacement tout au début du cryptage, et dans l'autre sens tout à la fin du décryptage.
 
4. Changer la méthode de cryptage, parce qu'il en existe beaucoup d'autres qui sont au moins aussi bonnes que la méthode par xor, même si elles nécéssitent un tout petit peu plus de programmation.
 

Reply

Marsh Posté le 12-04-2006 à 09:18:41    

Merci olivthill pour ta réponse.
 
En effet, le soucis c'est la fonction externe à laquelle je dois passer la chaine en PChar (donc forcément "null terminated" ). Comme je le disais dans le 1er message, je peux avoir n'importe quel caractère dans les chaines de départ et par conséquent n'importe quel caractère dans ma chaine cryptée. Si je viens à remplacer mon caractère NULL par un autre, par exemple un espace, je ne pourrais plus faire le distinguo un espace résultant d'une opération XOR et un espace signifiant "c'est un caractère NULL". J'aurai une valeur qui peut avoir 2 significations.
 
Je pense que je vais retenir ta 3ème solution, à savoir transformer ma chaine finale en hexa. Comme ca mon '\0' deviendra "00". Bon c'est pas ce qui est le plus économique niveau taille mais au moins je règle mon problème.
 
Quant à changer la méthode de cryptage, j'y avais songé mais bon malheureusement je n'ai pas plus trop le temps de m'y pencher :/
 
:hello:


Message édité par BaCkFiRe le 12-04-2006 à 09:19:33

---------------
"I'm as mad as hell and I'm not going to take this anymore !"
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed