2010-08-28 17 views
0

Je fais un programme pour implémenter x ou cryptage, tout en jouant avec mon programme j'ai entré diverses combinaisons de touches le programme fonctionnait parfaitement jusqu'à ce que j'ai entré la valeur de la clé: 904932 qui a causé l'ommition du caractère 'd' par exemple si j'entre 'salut mon nom est dexter et je déteste ma soeur stupide dede' dans edit1, cryptage et décryptage faire mon texte edit1: 'salut mon nom est exter an je hais ma stupi soeur ee ' que se passe-t-il?xor cryptage: réglage de la clé à 904932 manger 'd'

procedure TForm2.Button1Click(Sender: TObject); 
    var 
    c:char; 
    i,key: integer; 
    begin 
     s := edit1.Text; 
     edit1.Text := #0; 
     key := strtoint(edit2.text); 
     key := key + 128;//i am adding 128 so that i dont get NULL char 
     for I := 1 to length(s) do {or 0 to lenght(s)? i dont know} 
     begin 
     c := s[i]; 
     c := char(ord(c) xor key); 
     edit1.Text := edit1.Text + c; 
     end; 
    end; 
+2

Utiliser la clé: = strtoint (edit2.text) et $ 7F + 128; - Il résoudra votre problème NULL pour les chaînes ASCII. – kludg

Répondre

5

L'ajout de 128 ne résoudra pas votre problème. Ça bouge juste. Votre "xor key" juste x ou le dernier octet de votre clé, soit $ E4 dans votre cas de 904932. $ E4 + 128 sera arrondi (ie -256) à la valeur de l'octet 100, qui est l'ASCII valeur de "d". C'est pourquoi votre "d" a disparu.

Donc, je suppose ne devrait pas utiliser un tel algorithme xor si vous voulez afficher le texte crypté. Je suggère que vous fassiez un algorithme de permutation simple.

+0

le point étant qu'un entier est de 4 octets alors que le caractère dans ce cas est évidemment un seul octet. Donc OP doit utiliser une version pré-D2009. D2009 + aurait utilisé deux octets pour le caractère et n'aurait pas montré le problème, sinon il se serait manifesté d'une autre manière. –

+2

D2009 + version aurait montré le même problème, juste avec un décalage d'arrondi de 65536 au lieu de 256, car la clé est un entier de 32 bits. Donc, le numéro de clé serait un autre, mais facile à deviner, par exemple 65508 aurait supprimé les mêmes caractères 'd', depuis 65508 = 65536-128 + 100. –

+0

merci d'avoir répondu à ma question, j'ai encore quelques confusions: '' Votre '' clé xor "juste x ou le dernier octet de votre clé '' pourquoi xor clé seulement xor est le dernier octet de clé quelle est la raison et comment le surmonter (si possible) '' Donc je ne devrais pas utiliser un tel algorithme xor si vous voulez afficher le texte crypté '' alors pourquoi internet est-il plein d'exemples de cryptage xor? –

1

Il n'y a pas de problème à utiliser XOR même si le charbon obtenu est # 0, parce que $00 xor $E4 = $E4 qui révèle le caractère original. Le problème est que vous utilisez le résultat crypté comme une chaîne qui gère # 0 spécialement. Si vous spécifiez la chaîne cryptée en tant que tableau d'octets, cela devrait fonctionner. Si vous voulez l'afficher, utilisez BinToHex ou une séquence de IntToHex.

1

Voici une révision pour vous.

procedure TForm2.Button1Click(Sender: TObject); 
var 
    i,key: integer; 
begin 
    s := edit1.Text; 
    edit1.Text := ''; 
    key := strtoint(edit2.text); 
    if Key = 0 then //replacement for the +128 
    Key := 128 
    for I := 1 to length(s) do //string are 1 indexed. Dynamic arrays 0 indexed. 
    begin 
    s[i] := char(s[i] xor key); 
    end; 
    edit1.Text := S; //Much faster to assign a full string than to assign character by character. 
        //Also, this might fix your vanishing "d" problem. 
        //I didn't test it, but I suspect that 
        //edit1.Text + c might result in no change if c=#0 
end; 
+0

Il ne fonctionnera pas comme prévu, par exemple si le code ASCII de caractère correspond à la valeur de clé (octet converti), il va stocker # 0. Ce qui est un problème. –

+0

Il ne s'affichera probablement pas correctement, oui. Mais cela devrait fonctionner comme prévu si "S" est manipulé correctement. Mais là encore, nous chiffrons la chaîne à des fins de stockage, pas pour l'affichage. Bien sûr, si le but est l'affichage, il y a très peu d'algorithme de chiffrement qui fonctionnera à moins que vous ne convertissiez, par exemple, en Base64. Mais alors, le cryptage XOR devient totalement valide. –

2

Je recommande en fait en utilisant la cryptographie moderne comme AES-CBC, mais si vous voulez jouer avec la cryptographie rétro laisse alors vous amuser ici. Puisque votre sortie de cryptage est du texte, je pourrais suggérer l'utilisation de l'addition modulo plutôt que XOR. Utilisez uniquement XOR lorsque vous travaillez avec des octets, pas pour les caractères. Vous devrez éviter certains caractères spéciaux dans la sortie. Dans ce cas, vous semblez avoir des problèmes avec le caractère NULL. Vous pouvez éviter la sortie de caractères en définissant un jeu de caractères.
Par exemple, vous pouvez utiliser uniquement des caractères compris entre 1 et 127 (tous les caractères ASCII sauf NULL). Cela signifierait que la base serait 1 et que le module serait 126 = (127 - 1)

Pour coder un caractère, soustrayez d'abord la base. Ajoutez la valeur de clé. Ensuite, obtenez le résultat du module. Enfin, ajoutez la base arrière dans

La valeur décimale de la lettre minuscule d est 100.
100 -. 1 = 99 // soustrayez la base
99 + 904932 = 905031 // ajouter la valeur de clé, occasion votre exemplaire ici
905031% 126 = 99 // résultat module lol 904932% de = 0 99 + 1 = 100 // ajouter la base arrière dans

Étant donné que votre valeur de clé est divisible par le module 126 la sortie est égal à l'entrée.

Annulation de l'addition modulo est une procédure légèrement différente.
100-1 = 99 // soustraire la base
99-904932 = -904833 // soustraire la valeur de clé
-904833% 126 = -27 // module résultent
126 + -27 = 99 // ajouter le module au résultat du module
99 + 1 = 100 // rajouter la base dans

vous pouvez définir le module aussi haut que vous voulez inclure autant de caractères que vous voulez dans votre jeu de caractères, et Certains maths de fantaisie vous pouvez mapper des caractères aux valeurs entières en aucune façon. Bien que je dise que vous pouvez mapper les caractères de quelque façon que vous voulez la vérité est que vous êtes limité par le média sur lequel le texte est écrit. Vous ne pouvez pas définir un module supérieur au nombre total de caractères que le média peut transporter, mais vous pouvez avoir des mappages de caractères séparés pour les valeurs codées et décodées.

Je commenterai également votre sélection de valeur de clé. L'application de la même valeur de clé à tous les caractères concerne la forme de chiffrement la plus faible possible. (Est-ce que ROT13 peut vraiment être considéré comme un chiffrement?) Réfléchissez à certaines façons de faire varier la valeur de la clé pour chaque caractère. Quelque chose qui a été fait lorsque ce type de crypto était utilisé était d'incrémenter la clé d'une certaine valeur pour chaque caractère, ou d'ajouter la valeur du caractère traité à la clé.

+0

semble intéressant merci –