J'ai écrit ce code dans Le problème est que je reçois toujours une erreur lorsque je veux déchiffrer une erreur. Texte avec ce code: p> n'importe quel indices? p> p> c # code> pour chiffrer une chaîne avec une clé:
3 Réponses :
Si vous avez un caractère, un et vous pouvez ensuite utiliser le 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: p> 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. p> p> char code>, vous pouvez le convertir en integer, un
int code>.
^ code> 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. P>
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.
Voici un code simple pour chiffrer et déchiffrer
La fonction Decrypt échoue sur une chaîne avec une lettre majuscule dedans. Des mises à jour de cette fonction?
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 }
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)