Crypter et décrypter une chaîne de caractères en C#?
Comment crypter et décrypter une chaîne de caractères en C#?
- Suivez ce lien codeproject.com/KB/recipes/Encrypt_an_string.aspx
- Besoin de quelque chose de simple... ce lien a fonctionné pour moi saipanyam.net/2010/03/encrypt-query-strings.html
- Je vous recommande FORTEMENT de tomber 3DES et en utilisant AES-GCM. AES-GCM n'est PAS trouvé .NET 4.5 crypto libs et EST différent de " l'habitude de l'AES (=AES-CBC mode en général). AES-GCM est beaucoup mieux que "comme d'habitude" AES pour le chiffrement raison pour laquelle je n'entrerai pas dans les. Donc
jbtule
a la meilleure réponse ci-dessous en vertu de la présenteBouncy Castle AES-GCM
paragraphe. Si vous ne nous croyez pas, au moins faire confiance aux experts lors de la NSA NSA (Suite B @ nsa.gov/ia/programs/suiteb_cryptography/index.shtml :The Galois/Counter Mode (GCM) is the preferred AES mode.
) - Personnellement, je préfère AES-CBC + HMAC-SHA2 plus de AES-GCM pour la plupart des situations. GCM ne parvient pas catastrophique si vous jamais réutiliser un nonce.
- Nonce réutilisation sonne comme une mauvaise idée de commencer avec mais pouvez-vous donner plus de détails à ce sujet? lien ou par la poste? GCM remplace la SRC sur la NSA Suite B algorithmes ...
- Nonce réutilisation est une mauvaise idée, oui. Mais je l'ai vu arriver, même avec les programmeurs et les cryptographes. Si cela se produit, GCM se décompose totalement, tandis que CBC+HMAC ne se développe que quelques petites faiblesses. Avec SSL comme protocole de GCM est très bien, mais je ne suis pas à l'aise avec elle que la norme de "chiffrer&authentifier" de l'API.
- Double Possible de Simple à deux façon de chiffrement pour le C#
- peut-être ce utile de vous codeproject.com/Articles/16920/Encrypt-and-Decrypt-a-String
- Double Possible de le Chiffrement & Décrypter une Chaîne de caractères en C#
- C'est un beau fil avec fonctions déjà écrit, vous pouvez vous adapter à vous r préférence - c-sharpcorner.com/UploadFile/145c93/... - voir la section " Etape 2: Création de la classe Helper.'
Vous devez vous connecter pour publier un commentaire.
EDITION 2013-Oct: Bien que j'ai édité cette réponse plus de temps à résoudre des problèmes, veuillez consulter jbtule réponse pour une plus robuste, informé de la solution.
https://stackoverflow.com/a/10366194/188474
Réponse Originale À Cette Question:
Voici un exemple de travail dérivé de la "RijndaelManaged de Classe" de la documentation et la SCTM Kit de Formation.
EDITION 2012-avril: Cette réponse a été édité à l'avant-pend de la IV par jbtule de la suggestion et comme illustré ici:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.aesmanaged%28v=vs.95%29.aspx
Bonne chance!
RijndaelManaged
a une méthodeGenerateIV()
RijndaelManaged
classe. La documentation indique que le IV est réglé à une nouvelle valeur aléatoire à chaque fois que vous instancier la classe. Consultez la section remarques de la documentation: bit.ly/1ObZRzgVoici un exemple d'utilisation de RSA.
Important: Il y a une limite à la taille des données que vous pouvez crypter le cryptage RSA,
KeySize - MinimumPadding
. par exemple 256 octets (en supposant que 2048 bits) - 42 octets (min OEAP rembourrage) = 214 octets (max en clair taille)Remplacer your_rsa_key avec votre clé RSA.
Pour plus d'info, visitez MSDN - RSACryptoServiceProvider
RSA
pourrait être un bon ajustement. Le chiffrement asymétrique a ses utilise, mais ce n'est pas le bon choix comme un chiffrement par défaut. Votre exemple de code suivant ne fonctionnera pas pour les chaînes plus longues, parce que le RSA classe n'est pas conçu pour l'usage général de chiffrement. Si vous avez besoin de l'asymétrie de fonctionnalités que vous devez chiffrer une clé symétrique avec RSA et de crypter les données réelles avec cette clé symétrique. Donc, je crois toujours que votre réponse est de mauvais conseils.Si vous utilisez ASP.Net vous pouvez maintenant utiliser une fonctionnalité intégrée dans .Net 4.0 et ultérieures.
Système.Web.De sécurité.MachineKey
.Net 4.5 a
MachineKey.Protect()
etMachineKey.Unprotect()
..Net 4.0 a
MachineKey.Encode()
etMachineKey.Decode()
. Vous devez simplement régler le MachineKeyProtection à "Tous".À l'extérieur de ASP.Net cette classe semble générer une nouvelle clé à chaque application de redémarrer, donc ne fonctionne pas. Avec un rapide coup d'oeil dans ILSpy il me semble qu'il génère ses propres paramètres par défaut si l'application appropriée.les paramètres sont manquants. Donc, vous pourriez être en mesure de le configurer à l'extérieur ASP.Net.
Je n'ai pas été en mesure de trouver un non-ASP.Net équivalent à l'extérieur du Système.Web espace de noms.
BouncyCastle est une grande bibliothèque Crypto pour .NET, il est disponible comme un Nuget paquet pour l'installer dans vos projets. Je l'aime beaucoup plus que ce qui est actuellement disponible dans le Système.De sécurité.Bibliothèque de cryptographie. Il vous donne beaucoup plus d'options en termes d'algorithmes disponibles, et fournit plus de modes pour ces algorithmes.
C'est un exemple de mise en œuvre de TwoFish, qui a été écrit par Bruce Schneier (héros nous paranoïaque des gens là-bas). C'est un algorithme symétrique comme le Rijndael
(aka AES). Il était l'un des trois finalistes pour le standard AES et frère de l'autre célèbre algorithme écrit par Bruce Schneier appelé BlowFish.
Première chose à bouncycastle est de créer un crypteur de la classe, ce sera plus facile à mettre en œuvre d'autres algorithmes de chiffrement par bloc au sein de la bibliothèque. La suite crypteur de classe prend en argument générique T où T implémente IBlockCipher et a un constructeur par défaut.
Mise à JOUR: en Raison de la demande populaire, j'ai décidé de mettre en œuvre la génération aléatoire IV ainsi que d'inclure un HMAC dans cette classe. Bien que d'un style de ce point de vue va à l'encontre de la SOLIDE principe de responsabilité unique, en raison de la nature de ce que cette classe ne comprend je reniged. Cette classe va maintenant prendre deux paramètres génériques, l'une pour le chiffrement et une pour le digérer. Il génère automatiquement la IV à l'aide de RNGCryptoServiceProvider de fournir un bon générateur de nombres aléatoires de l'entropie, et vous permet d'utiliser tout ce digest algorithm que vous voulez de BouncyCastle pour générer le MAC.
Ensuite il suffit d'appeler le chiffrer et de déchiffrer des méthodes sur la nouvelle classe, voici l'exemple d'utilisation de twofish:
Il est tout aussi facile de le remplacer par un autre algorithme de chiffrement par bloc comme TripleDES:
Enfin, si vous souhaitez utiliser AES avec SHA256 HMAC vous pouvez effectuer les opérations suivantes:
La partie la plus difficile sur le chiffrement traite avec les touches et pas les algorithmes. Vous aurez à réfléchir sur l'endroit où vous stockez vos clés, et si vous avez, comment vous les échanger. Ces algorithmes ont tous résisté à l'épreuve du temps, et sont extrêmement difficiles à briser. Quelqu'un qui veut voler des informations à partir de vous n'est pas passer l'éternité à faire la cryptanalyse sur vos messages, ils vont essayer de comprendre ce que ou de où les de votre clé. Donc #1 choisissez vos clés à bon escient, #2 de les stocker dans un endroit sûr, si vous utilisez un site web.config IIS et puis vous pouvez chiffrer les pièces du web.config, et enfin, si vous avez à échanger des touches assurez-vous que votre protocole pour l'échange de la clé est sécurisé.
Mise à jour 2
Changé la méthode de comparaison de protéger contre les attaques temporelles. Voir plus d'infos ici http://codahale.com/a-lesson-in-timing-attacks/ . Également mis à jour à défaut de remplissage PKCS7 et ajouté de nouvelles constructeur afin de permettre à l'utilisateur final la possibilité de choisir le rembourrage qu'ils souhaitent utiliser. Merci @CodesInChaos pour les suggestions.
SequenceEqual
. Cela évite de synchronisation du canal latéral que les fuites de combien de temps un préfixe de la MAC et le réel MAC match.HMAC
classe viennent de Système.De sécurité.La cryptographie ou Org.BouncyCastle.Crypto.Les mac?Avertissement: Cette solution ne devrait être utilisé pour les données au repos qui n'est pas exposé au public (par exemple un fichier de configuration ou DB). Seulement dans ce scénario, le quick-and-dirty solution peut être considérée comme meilleure que @jbtule de la solution, en raison de la baisse maintanance.
Original post:
J'ai trouvé jbtule's réponse un peu compliqué pour un rapide et sale sécurisé AES cryptage des chaînes et Brett's réponse avait un bug avec le Vecteur d'Initialisation étant une valeur fixe, ce qui la rend vulnérable à la remplissage des attaques, donc, je fixe Brett code et ajout d'un hasard IV, qui est ajouté à la chipered de la chaîne, de la création d'une autre valeur chiffrée à chaque chiffrement de la même valeur:
De chiffrement:
Décryptage:
Remplacer EncryptionKey avec votre clé.
Dans mon implémentation, la clé est enregistrée dans le fichier de configuration (web.config\app.config) que vous ne devriez pas enregistrer codés en dur. Le fichier de configuration doit être également chiffrés donc, la clé ne seront pas enregistrées en tant que texte clair en elle.
Encrypt
méthode génère une valeur différente pour chaque appel même avec le même texte brut, leSubstring(20)
sera la même à chaque fois, non?Encrypt
généré un autre IV à chaque fois. Pour une raison que je pensais le IV était le même à chaque fois, ce qui serait pratiquement le rendre inutile.De chiffrement
Décryptage:
Avec la référence de Crypter et Décrypter une Chaîne de caractères en c#, j'ai trouvé une bonne solution :
Pour Chiffrer
Pour Décrypter
Encoding.ASCII.GetBytes
pour les données qui vise à ajouter de l'entropie à quelque chose que l'homme choisi, va être de moins en moins alors l'entropie que prévu et est un très novice erreur. Ce sont toutes les choses qui sont faciles à corriger, mais vous ne l'êtes pas, donc mon avertissement en gras séjours, en raison des implications de sécurité.À l'appui de mattmanser répondre. Voici un exemple d'utilisation MachineKey classe pour chiffrer/déchiffrer les URL des valeurs sûres.
Quelque chose à garder à l'esprit, comme mentionné avant, ce sera l'utilisation de la Machine paramètres de configuration (https://msdn.microsoft.com/en-us/library/ff649308.aspx). Vous pouvez définir le chiffrement et le déchiffrement de la clé/algorithme manuellement (vous pourriez avoir besoin de ce spécialement si votre site est en cours d'exécution sur plusieurs serveurs) dans le web.fichier de configuration. Vous pouvez générer des clés à partir de IIS (voir ici: https://blogs.msdn.microsoft.com/vijaysk/2009/05/13/iis-7-tip-10-you-can-generate-machine-keys-from-the-iis-manager/) ou utiliser en ligne machine générateur de clé comme: http://www.developerfusion.com/tools/generatemachinekey/
Voici un exemple simple de cryptage des chaînes de caractères en C# à l'aide d'AES en mode CBC avec aléatoire IV et HMAC et mot de passe-clés dérivées, d'afficher la base de pièces mobiles:
mismatch += found[i]^computed[i]
à la place. 3) Vous êtes à l'aide de plus de 20 octets de PBKDF2-HMAC-SHA-1 qui ralentit votre KDF par un facteur de 2 sans ralentir un attaquantSi vous avez obtenu ici à la recherche d'un chiffrement PGP, dans le commentaire suivant sur un exemple de la façon d'utiliser le cryptage PGP via BouncyCastle, le
PGPEncryptDecrypt
classe semble fonctionner, essentiellement, de la boîte:http://blogs.microsoft.co.il/kim/2009/01/23/pgp-zip-encrypted-files-with-c/#comment-611002
Trop de temps à coller ici, légèrement modifié: https://gist.github.com/zaus/c0ea1fd8dad5d9590af1
Une alternative à BouncyCastle pour AES-GCM de chiffrement est libsodium-net. Elle enveloppe l'libsodium C de la bibliothèque. Un bel avantage, c'est qu'il utilise l'AES-NI extension dans les Processeurs très rapides de chiffrement. L'inconvénient est qu'il ne fonctionne pas du tout si le CPU n'ont pas l'extension. Il n'y a pas de logiciel de tomber en arrière.
C'est la classe qui a été placé ici par Brett. Cependant j'ai fait une petite edit depuis que j'ai été reçu l'erreur "Invalid longueur de Base-64 char array' lorsque vous l'utilisez pour des chaînes d'URL pour chiffrer et déchiffrer.
ConvertStringArrayToString()
méthode utilisée pour l'?Le code suivant est une version améliorée de Ghazal réponse similaires question.
Le chiffrement est un très commun de la matière dans la programmation. Je pense qu'il est préférable d'installer un package de faire le travail pour vous. Peut-être un simple open source Nuget projet comme
Simple Cryptage Aes
La clé est dans le fichier de configuration et il est donc facile de changer dans l'environnement de production, et je ne vois pas d'inconvénients
L'exemple suivant montre comment chiffrer et déchiffrer les données de l'échantillon:
Copié dans mon réponse ici d'une question similaire: Simple à deux façon de chiffrement pour C#.
Basée sur de multiples réponses et commentaires.
Code:
Ici est Extrait de simple à l'origine par l'ASP des Extraits de
Algorithme AES:
Encryption
méthode et ne persiste pas, il n'est pas nécessaire d'avoir cette méthode à tous les autres que pour les besoins de la démonstration. 3) Il n'y a pas d'authentification du texte chiffré, de sorte que les attaquants peuvent manipuler sans vous de le détecter (voir: padding oracle attaque)._iv
variable de classe et pas écrit dans le texte chiffré. Alors, comment pensez-vous que le récepteur connaître la clé et IV? Ils doivent être distribués de quelque autre façon. Depuis le IV n'est pas censé être secret, il doit être généré de façon aléatoire pour chaque chiffrement et distribué avec le texte chiffré.Voici l'exemple de comment AES-GCM de chiffrement/déchiffrement peut être fait en utilisant château Gonflable paquet.
J'ai trouvé que l'échantillon lors de la googlé pour la possibilité de déchiffrer les données de GOlang
crypto/aes
api:.Net de l'échantillon fonctionne comme un charme avec des clés de 256 bits), mac (128 bits) et nonce (96 bits).
pour des raisons de simplicité j'ai fait pour moi-même cette fonction que j'utilise pour les non crypto fins : remplacer "yourpassphrase" avec votre mot de passe ...
}
encryptor.TransformFinalBlock
est plus simple que d'utiliser ceux de la mémoire et de chiffrement des flux.Un bon algorithme de façon sécurisée des données de hachage est BCrypt:
Il y a une belle .NET de la mise en œuvre de BCrypt qui est disponible a également comme un package NuGet.
Je veux vous donner mon contribuer, à mon code pour l'AES
Rfc2898DeriveBytes
(ici la documentation) algorhytm, écrit en C# (.NET framework 4) et travaille également pour limité de plates-formes, comme .NET Compact Framework pour Windows Phone 7.0+ (pas toutes les plates-formes de support de chaque criptographic méthode de l' .NET framework!).J'espère que cela peut aider quelqu'un!
IVa
qui n'est pas IV, mais un mot de passe? 2) Pourquoi vous mettez-vous IV=Clé? Vous avez besoin d'une nouvelle aléatoire IV pour chaque chiffrement. 3) le Manque de MAC permet padding oracle attaquesVous devez utiliser l'espace de noms à l'aide du Système.De sécurité.La cryptographie; et useHashing est un type bool true ou false. Variable de chaîne "clés" doit être la même pour le Chiffrement et le Déchiffrement