12
votes

Aidez-moi avec le cryptage XOR

J'ai écrit ce code dans c # pour chiffrer une chaîne avec une clé: xxx

Le problème est que je reçois toujours une erreur lorsque je veux déchiffrer une erreur. Texte avec ce code: xxx

n'importe quel indices?


5 commentaires

Tout ce que je peux dire, c'est hein? :) Peut-être que c'est un exercice éducatif mais vous n'avez pas besoin de convertir les caractères en chaînes, Xor eux les convertit à une chaîne. Comme prouvé que vos fonctions déc2bin et Bin2Dec, le caractère peut être converti en et vers des INT avec des moulages, il suffit de prendre des chariots à partir des deux chaînes, appliquez l'opérateur «^ 'XOR et mettez-le dans une nouvelle chaîne.


Cela aiderait si vous spécifiez quelle erreur vous obtenez :)


De plus, vous voudrez peut-être utiliser Stringbuilders au lieu de cordes. Les chaînes sont immuables (elles ne peuvent pas être changées), alors des choses comme _str + = _temp; Génère une nouvelle chaîne à chaque fois, ce qui rend cette méthode inutilement lourde / coûteuse. Utilisez un StringBuilder et .append (TEMP).


@Michael STUM: Il s'avère que StringBuilder peut effectivement être plus lente, ou à peu près la même chose que d'utiliser la concaténation. Seulement pour les grandes chaînes est StringBuilder mieux.


@siride Cela peut être plus lent, mais c'est principalement des concaténations triviales (je pense à environ 3-4 chaînes). Dans son cas, la boucle n'est pas déterministe car elle dépend de la longueur de la chaîne d'entrée. L'utilisation d'un SB est donc un pari plus sûr (et si le cours l'initialise avec une taille de tampon sain d'une longueur de tampon)


3 Réponses :


51
votes

Si vous avez un caractère, un char , vous pouvez le convertir en integer, un int .

et vous pouvez ensuite utiliser le ^ opérateur pour effectuer XOR dessus. Vous ne semblez pas utiliser cet opérateur pour le moment, ce qui pourrait être la source de votre problème. xxx

ce genre de chose. Voici une version plus longue avec des commentaires qui font la même chose en étapes, pour faciliter l'apprentissage de: xxx

La version courte est la même mais avec les variables intermédiaires supprimées, substituer des expressions directement dans les endroits où ils sont utilisés.


2 commentaires

Est-il possible de rendre cette méthode ne renvoie que des valeurs numériques alpha? Cela fonctionne mais produit des personnages étranges. Et j'en ai besoin d'être lisible par l'homme pour mon étui d'utilisation.


@Dbloom Pour restreindre la plage de caractères utilisés sans perdre d'informations, vous devez effectuer une deuxième conversion sur un codage tel que HEX ou BASE64. Notez que ceux-ci ne seront pas du tout «humains lisibles», mais ils seront sans danger pour envoyer des formats de texte, des opérations de presse-papiers, etc.



0
votes

Voici un code simple pour chiffrer et déchiffrer xxx


1 commentaires

La fonction Decrypt échoue sur une chaîne avec une lettre majuscule dedans. Des mises à jour de cette fonction?



1
votes
public static byte[] EncryptOrDecrypt(byte[] text, byte[] key)
{
    byte[] xor = new byte[text.Length];
    for (int i = 0; i < text.Length; i++)
    {
        xor[i] = (byte)(text[i] ^ key[i % key.Length]);
    }
    return xor;
}

static void Main(string[] args){
    string input;
    byte[] inputBytes;

    string inputKey;
    byte[] key;

    do
    {
        input = System.Console.ReadLine();
        inputBytes = Encoding.Unicode.GetBytes(input);

        inputKey = System.Console.ReadLine();
        key = Encoding.Unicode.GetBytes(inputKey);

        //byte[] key = { 0, 0 }; if key is 0, encryption will not happen

        byte[] encryptedBytes = EncryptOrDecrypt(inputBytes, key);
        string encryptedStr = Encoding.Unicode.GetString(encryptedBytes);

        byte[] decryptedBytes = EncryptOrDecrypt(encryptedBytes, key);
        string decryptedStr = Encoding.Unicode.GetString(decryptedBytes);

        System.Console.WriteLine("Encrypted string:");
        System.Console.WriteLine(encryptedStr);
        System.Console.WriteLine("Decrypted string:");
        System.Console.WriteLine(decryptedStr);

    } while (input != "-1" && inputKey != "-1");
    //test:
    //pavle
    //23
    //Encrypted string:
    //BRD_W
    //Decrypted string:
    //pavle
}

0 commentaires