Voici un article et un article de la base de connaissances Microsoft très similaire sur la manière dont le mode ECB génère du code qui n'est pas chiffré.
Voir également ce message similaire de Rook
Message en texte clair:
Le même message chiffré en mode ECB (peu importe le chiffrement que vous utilisez):
Le même message EXACT en mode CBC (encore une fois, peu importe ce que chiffrement que vous utilisez):
La mauvaise manière
chaîne statique publique Encrypt (chaîne toEncrypt, clé de chaîne, bool useHashing) { byte [] keyArray = UTF8Encoding.UTF8.GetBytes (key); byte [] toEncryptArray = UTF8Encoding.UTF8.GetBytes (toEncrypt); if (useHashing) keyArray = new MD5CryptoServiceProvider (). ) {Key = keyArray, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7}; ICryptoTransform cTransform = tdes.CreateEncryptor (); byte [] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEntrcryptArray.Tength) (resultArray, 0, resultArray.Length);}
L'erreur est dans la ligne suivante
{Key = keyArray, Mode = CipherMode.ECB , Padding = PaddingMode.PKCS7};
La bonne manière
Les bonnes gens de Microsoft m'ont envoyé le code suivant pour corriger cet article de la base de connaissances lié ci-dessus. Ceci est référencé dans le cas # 111021973179005
Cet exemple de code utilise AES pour crypter les données, et la clé du cryptage AES est le code de hachage généré par SHA256. AES est l'algorithme Advanced Encryption Standard (AES). L'algorithme AES est basé sur des permutations et des substitutions. Les permutations sont des réarrangements de données et les substitutions remplacent une unité de données par une autre. AES effectue des permutations et des substitutions en utilisant plusieurs techniques différentes. Pour plus d'informations sur AES, reportez-vous à l'article «Protégez vos données avec la nouvelle norme de chiffrement avancée» sur MSDN Magazine à l'adresse http://msdn.microsoft.com/en-us/magazine/cc164055.aspx.
SHA est l'algorithme de hachage sécurisé. SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512) est maintenant recommandé. Pour plus d'informations sur les valeurs de hachage dans .NET Framework, reportez-vous à http://msdn.microsoft.com/en-us/library/92f9ye3s.aspx#hash_values .
La valeur par défaut du mode de fonctionnement de l'algorithme symétrique pour AesCryptoServiceProvider
est CBC. CBC est le mode de chaînage de blocs de chiffrement. Il introduit des commentaires. Avant que chaque bloc de texte brut ne soit chiffré, il est combiné avec le texte chiffré du bloc précédent par une opération OU exclusive au niveau du bit. Cela garantit que même si le texte brut contient de nombreux blocs identiques, chacun sera chiffré dans un bloc de texte chiffré différent. Le vecteur d'initialisation est combiné avec le premier bloc de texte brut par une opération OU exclusive au niveau du bit avant que le bloc ne soit chiffré. Si un seul bit du bloc de texte chiffré est mutilé, le bloc de texte brut correspondant sera également mutilé. De plus, un morceau du bloc suivant, dans la même position que le bit mutilé d'origine, sera mutilé. Pour plus d'informations sur CipherMode
, veuillez consulter http://msdn.microsoft.com/en-us/library/system.security.cryptography.ciphermode.aspx.
Voici l'exemple de code.
// Cette fonction est utilisée pour crypter les données avec la clé et iv.
byte [] Encrypt (byte [] data, byte [] key, byte [] iv) {// Créer un AESCryptoProvider. using (var aesCryptoProvider = new AesCryptoServiceProvider ()) {// Initialisez l'AESCryptoProvider avec la clé et iv. aesCryptoProvider.KeySize = key.Length * 8; aesCryptoProvider.IV = iv; aesCryptoProvider.Key = clé; // Créer un chiffreur à partir de AESCryptoProvider. using (ICryptoTransform encryptor = aesCryptoProvider.CreateEncryptor ()) {// Créer un flux mémoire pour stocker les données chiffrées. using (MemoryStream stream = new MemoryStream ()) {// Créez un CryptoStream pour crypter les données. using (CryptoStream cryptoStream = new CryptoStream (stream, encryptor, CryptoStreamMode.Write)) // Crypter les données. cryptoStream.Write (données, 0, données.Longueur); // renvoie les données chiffrées. retourne stream.ToArray (); }}}} // Cette fonction est utilisée pour déchiffrer les données avec la clé et iv.byte [] Decrypt (byte [] data, byte [] key, byte [] iv) {// Créer un AESCryptoServiceProvider. using (var aesCryptoProvider = new AesCryptoServiceProvider ()) {// Initialisez AESCryptoServiceProvier avec la clé et iv. aesCryptoProvider.KeySize = key.Length * 8; aesCryptoProvider.IV = iv; aesCryptoProvider.Key = clé; // Créer un déchiffreur à partir de AESCryptoServiceProvider. using (ICryptoTransform decryptor = aesCryptoProvider.CreateDecryptor ()) {// Créer un flux mémoire comprenant les données chiffrées. using (MemoryStream stream = new MemoryStream (data)) {// Créez un CryptoStream pour décrypter les données chiffrées. using (CryptoStream cryptoStream = new CryptoStream (stream, decryptor, CryptoStreamMode.Read)) {// Créer un tableau de tampons d'octets.
byte [] readData = nouvel octet [1024]; int readDataCount = 0; // Crée un flux mémoire pour stocker les données déchiffrées. using (MemoryStream resultStream = new MemoryStream ()) {do {// Décrypter les données et écrire les données dans le tableau de tampons readData. readDataCount = cryptoStream.Read (readData, 0, readData.Length); // Ecrit les données déchiffrées dans resultStream. resultStream.Write (readData, 0, readDataCount); } // Vérifiez s'il n'y a plus de données chiffrées dans le flux. while (readDataCount > 0); // Renvoie les données déchiffrées. return resultStream.ToArray (); }}}}}} // Cette fonction est utilisée pour générer un binaire de clé valide avec un codage UTF8 et un algorithme de hachage SHA256.byte [] GetKey (clé de chaîne) {// Créer une classe d'algorithme de hachage SHA256. using (SHA256Managed sha256 = new SHA256Managed ()) // Décode la clé de chaîne en binaire et calcule le binaire de hachage de la clé. return sha256.ComputeHash (Encoding.UTF8.GetBytes (key));}
Pour plus de détails sur les classes dans l'exemple de code, veuillez vous référer aux liens suivants:
· Classe AesCryptoServiceProvider
· Classe SHA256Managed
· Classe CryptoStream
De plus, il existe plusieurs articles qui peuvent vous aider à mieux comprendre la cryptographie dans .NET Framework, veuillez vous référer aux liens ci-dessous:
· Services de cryptographie
· Modèle de cryptographie .NET Framework
· Un guide simple de la cryptographie
· Chiffrement sans Secrets