Je recherche des fonctionnalités d'obfuscation très simples (comme crypter et décrypter mais pas nécessairement sécurisées) pour certaines données. Ce n'est pas essentiel à la mission. J'ai besoin de quelque chose pour garder les honnêtes gens honnêtes, mais quelque chose d'un peu plus fort que ROT13 ou Base64 .
Je préfère quelque chose qui est déjà inclus dans le .NET Framework 2.0, donc je n'ai pas à me soucier des dépendances externes.
Je ne veux vraiment pas avoir à jouer avec les clés publiques / privées, etc. Je bousillerais probablement les maths et le rendrais banal.
c#
obfuscation
Matt Dawdy
la source
la source
Réponses:
D'autres réponses fonctionnent bien, mais AES est un algorithme de chiffrement plus sécurisé et à jour. Il s'agit d'une classe que j'ai obtenue il y a quelques années pour effectuer le cryptage AES que j'ai modifié au fil du temps pour être plus convivial pour les applications Web (par exemple, j'ai construit des méthodes Encrypt / Decrypt qui fonctionnent avec une chaîne compatible URL). Il a également les méthodes qui fonctionnent avec les tableaux d'octets.
REMARQUE: vous devez utiliser différentes valeurs dans les tableaux Clé (32 octets) et Vecteur (16 octets)! Vous ne voudriez pas que quelqu'un comprenne vos clés en supposant simplement que vous avez utilisé ce code tel quel! Tout ce que vous avez à faire est de modifier certains des nombres (qui doivent être <= 255) dans les tableaux de clés et de vecteurs (j'ai laissé une valeur non valide dans le tableau de vecteurs pour vous assurer de le faire ...). Vous pouvez utiliser https://www.random.org/bytes/ pour générer facilement un nouvel ensemble:
Key
Vector
Son utilisation est simple: il suffit d'instancier la classe, puis d'appeler (généralement) EncryptToString (chaîne StringToEncrypt) et DecryptString (chaîne StringToDecrypt) comme méthodes. Cela ne pourrait pas être plus facile (ou plus sûr) une fois que cette classe est en place.
la source
J'ai nettoyé SimpleAES (ci-dessus) pour mon usage. Correction des méthodes de chiffrement / déchiffrement alambiquées; des méthodes séparées pour coder les tampons d'octets, les chaînes et les chaînes compatibles avec les URL; fait usage des bibliothèques existantes pour le codage des URL.
Le code est petit, plus simple, plus rapide et la sortie est plus concise. Par exemple,
[email protected]
produit:Code:
la source
Oui, ajoutez l'
System.Security
assembly, importez l'System.Security.Cryptography
espace de noms. Voici un exemple simple de chiffrement d'algorithme symétrique (DES):la source
Je pensais juste ajouter que j'ai amélioré SimplerAES de Mud en ajoutant un IV aléatoire qui est renvoyé à l'intérieur de la chaîne cryptée. Cela améliore le cryptage car le cryptage de la même chaîne entraînera une sortie différente à chaque fois.
Et test unitaire bonus
la source
System.Random
comme RNG. 2) Ceci est totalement rompu contre les attaques de texte chiffré choisi (en particulier les oracles de remplissage)Une variante de Marks (excellente) réponse
J'espère que cela t'aides
la source
[EDIT] Des années plus tard, je suis revenu pour dire: ne fais pas ça! Voir Qu'est-ce qui ne va pas avec le cryptage XOR?pour plus de détails.
Un cryptage bidirectionnel très simple et facile est le cryptage XOR.
mypass
.mypassmypassmypass...
)mypassmypassmypass...
).la source
J'ai combiné ce que j'ai trouvé de mieux à partir de plusieurs réponses et commentaires.
Code:
Mise à jour 2015-07-18: Correction d'une erreur dans la méthode Encrypt () privée par les commentaires de @bpsilver et @Evereq. IV a été accidentellement chiffré, est maintenant ajouté en texte clair comme prévu par Decrypt ().
la source
return _encryptor.TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
byte [] inputBuffer = _encryptor.TransformFinalBlock(buffer, 0, buffer.Length); return _rijndael.IV.Concat(inputBuffer).ToArray();
Si vous voulez simplement un chiffrement simple (c'est-à-dire, possible pour un pirate déterminé de se casser, mais en bloquant la plupart des utilisateurs occasionnels), choisissez simplement deux phrases de passe de longueur égale, dites:
et xor vos données avec les deux (en bouclant les phrases secrètes si nécessaire) (a) . Par exemple:
Quelqu'un qui recherche dans votre binaire peut penser que la chaîne d'ADN est une clé, mais il est peu probable qu'il pense que le code C est autre chose qu'une mémoire non initialisée enregistrée avec votre binaire.
(a) Gardez à l'esprit qu'il s'agit d' un cryptage très simple et, selon certaines définitions, ne peut pas du tout être considéré comme du cryptage (puisque le but du cryptage est d' empêcher l'accès non autorisé plutôt que de le rendre plus difficile). Bien sûr, même le cryptage le plus puissant n'est pas sûr lorsque quelqu'un se tient au-dessus des porte-clés avec un tuyau en acier.
Comme indiqué dans la première phrase, c'est un moyen de rendre assez difficile pour l'attaquant occasionnel de continuer. C'est similaire à la prévention des cambriolages sur votre maison - vous n'avez pas besoin de la rendre imprenable, il vous suffit de la rendre moins prégnable que la maison voisine :-)
la source
Le chiffrement est facile: comme d'autres l'ont souligné, il existe des classes dans l'espace de noms System.Security.Cryptography qui font tout le travail pour vous. Utilisez-les plutôt que n'importe quelle solution maison.
Mais le déchiffrement est également facile. Le problème que vous rencontrez n'est pas l'algorithme de chiffrement, mais la protection de l'accès à la clé utilisée pour le déchiffrement.
J'utiliserais l'une des solutions suivantes:
DPAPI utilisant la classe ProtectedData avec la portée CurrentUser. C'est facile car vous n'avez pas à vous soucier d'une clé. Les données ne peuvent être déchiffrées que par le même utilisateur, donc pas bon pour le partage de données entre utilisateurs ou machines.
DPAPI utilisant la classe ProtectedData avec la portée LocalMachine. Idéal pour, par exemple, protéger les données de configuration sur un seul serveur sécurisé. Mais toute personne qui peut se connecter à la machine peut la crypter, donc rien de bien si le serveur n'est pas sécurisé.
Tout algorithme symétrique. J'utilise généralement la méthode statique SymmetricAlgorithm.Create () si je me fiche de l'algorithme utilisé (en fait, c'est Rijndael par défaut). Dans ce cas, vous devez en quelque sorte protéger votre clé. Par exemple, vous pouvez le masquer d'une manière ou d'une autre et le cacher dans votre code. Mais sachez que toute personne suffisamment intelligente pour décompiler votre code sera probablement en mesure de trouver la clé.
la source
Je voulais publier ma solution car aucune des solutions ci-dessus n'est aussi simple que la mienne. Laissez-moi savoir ce que vous pensez:
Optionnel
Cela suppose que la MachineKey du serveur utilisé pour chiffrer la valeur est la même que celle utilisée pour déchiffrer la valeur. Si vous le souhaitez, vous pouvez spécifier une MachineKey statique dans Web.config afin que votre application puisse décrypter / crypter les données quel que soit l'endroit où elles sont exécutées (par exemple, développement vs serveur de production). Vous pouvez générer une clé machine statique en suivant ces instructions .
la source
L'espace de noms
System.Security.Cryptography
contient les classesTripleDESCryptoServiceProvider
etRijndaelManaged
N'oubliez pas d'ajouter une référence à l'
System.Security
assemblage.la source
Utilisation de TripleDESCryptoServiceProvider dans System.Security.Cryptography :
la source
J'ai changé ça :
pour ça:
la source
À l'aide de la bibliothèque de cryptographie .Net intégrée, cet exemple montre comment utiliser la norme de cryptage avancée (AES).
la source
Je sais que vous avez dit que vous ne vous souciez pas de la sécurité, mais si vous choisissez DES, vous pourriez aussi bien prendre AES, c'est la méthode de cryptage la plus à jour.
la source
J'ai utilisé la réponse acceptée par Mark Brittingham et cela m'a beaucoup aidé. Récemment, j'ai dû envoyer du texte crypté à une autre organisation et c'est là que certains problèmes sont survenus. L'OP ne nécessite pas ces options, mais comme c'est une question populaire, je poste ma modification (
Encrypt
et lesDecrypt
fonctions empruntées ici ):RijndaelManaged
valeurs par défaut et un où les valeurs de propriété peuvent être spécifiées (sur la base d'un accord mutuel entre les parties de chiffrement et de déchiffrement)Voici la classe (échantillon de test à la fin):
et..
Voici l'exemple de test:
la source
Je pense que c'est le monde le plus simple!
Tester
la source