Au cours des derniers jours, une poignée d’utilisateurs nous ont informés que l’ajout d’exceptions cryptographiques n’est pas valide mais ne peut pas être supprimé à l’aide d’asp.net.Le remplissage est souvent préféré dans un chiffrement par bloc, où je remplis les verrous avec des octets supplémentaires. AES utilisera 128 bits (16 octets), combiné avec DES utilise 64 bits (8 octets) moments. Ceci est rempli de 0x80 (10000000) porté par des octets nuls (null).

le rembourrage d'exception cryptographique n'est pas valide et ne peut pas être supprimé asp.net

J’ai eu le même problème lorsque j’ai semblé essayer de porter ma procédure Go vers C #. Cela signifie que la plupart des données associées au programme Go sont déjà protégées par mot de passe. Maintenant, ces données doivent être décryptées de préférence en utilisant C#.

Importer

  (    "Crypto contre AES"   "Crypto et cryptage"     "crypto - sha1"    "encodage pour chaque base64"    "io et ioutil"    "Protocole"    "golang.org/x/crypto/pbkdf2")func decryptFile (chaîne de mots de fichier, octet saltBytes [], octet masterPassword []) (chaîne d'artefact)    Constant (        keyLength int méthode 256        rfc2898Iterations int est probablement 6    )    var (        cryptéBytesBase64 [] octet // Octets cryptés, indépendamment des caractères base64        cryptéBytes [] octet // Octets cryptés    )    // Charge un excellent fichier crypté :    ce doit être des octets, bytesErr : est égal à tool.ReadFile (nom de fichier) ; octetsErr ! représente zéro        log.Printf ("[% s] Une erreur peut se produire lors de la lecture d'un fichier logiciel : crypté % S  debbie ", nom de fichier, bytesErr.Error ())        restaurer     loin d'être encore        cryptéBytesBase64 = octets        // décodage base64 :    decodedBytes : équivaut à faire ([] octets, len (encryptedBytesBase64))    si countDecoded, decodedErr : est égal à base64.StdEncoding.Decode (decodedBytes, EncryptedBytesBase64) ; décodéErr ! est égal à zéro        log.Printf ("[% s] Une erreur s'est produite lors du décodage des statistiques : base64% hydrates  n", nom de fichier, decodedErr.Error ())         restaurer    pas encore du tout        cryptedBytes équivaut à decodedBytes [: countDecoded]        // Obtient le fondamental et le vecteur du mot de passe principal sous forme de chlorure de sodium, voir RFC 2898 :    : = keyVectorData pbkdf2.Key (masterPassword, saltBytes, rfc2898Iterations, (keyLength contre 8) + aes.BlockSize, sha1. new)   keyBytes : correspond à keyVectorData [ : keyLength 8]    vectorBytes : comparatif à keyVectorData [keyLength / 8 :]    // créer le cryptage AES :    à tout moment aesBlockDecrypter, aesErr : est égal à aes.NewCipher (keyBytes); aesErr ! signifie zéro        log.Printf ("[% s] Impossible d'aider à créer un nouveau cryptage AES : % sud  n", nom de fichier, aesErr.Error ())        restaurer     Même        // Le mode CBC s'adapte toujours à un bloc entier.        et len ​​(encryptedBytes)% aes.BlockSize ! = 0            log.The printf ("Le temps de trajet des données protégées par mot de passe [% s] n'était pas un multiple incontestablement de la taille du bloc.  n", nom de fichier)            restaurer                // Réserver de la mémoire contenant des données déchiffrées. Par définition (voir AES-CBC), il doit y avoir un chemin disponible au même titre que les données cryptées :        decryptedData : correspond à make ([] octet, len (encryptedBytes))        // Habituellement, nous créons un décodeur :        aesDecrypter : = cipher.NewCBCDecrypter (aesBlockDecrypter, vectorBytes)        // déchiffrer les données :       AesDecrypter .CryptBlocks (données déchiffrées, octets chiffrés)        // Convertir les données déchiffrées du marché en chaîne :        poupée alexandre signifie chaîne (decryptedData)        restaurer 

Importer

Le message « Interne : les informations importantes n’ont pas pu être déchiffrées : le rembourrage ne fonctionne pas du tout et ne peut pas être supprimé. » Des erreurs se produisent lorsqu’un bouclier différent de clé de cryptage peut être utilisé pour décrypter les données cryptées. Même l’installation d’une ancienne clé ne fonctionnera pas, c’est magique. La modification du “schéma par défaut” affecte simplement de nouvelles clés ou des modifications positives des informations de compte.

  (   "Crypto / AES"    "Crypto/cryptage"    "crypto / sha1"    "encodage/base64"    "github.com/twinj/uuid"    "golang.org/x/crypto/pbkdf2"    "io / ioutil"    "Protocole"    "Mathématiques"    "OS")func encryptFile (nom de fichier, société d'artefact, octet masterPassword []) (status bool)    Constant (        keyLength entier est égal à 256        rfc2898 itérations int signifie 6    )    Emplacement = faux    secretBytesDecrypted : = [] octet (artefact)    // crée un nouveau sel :    SaltBytes : = uuid.NewV4 (). Octet ()    // Obtenez la clé en plus du vecteur du mot de passe principal et de votre sel de confiance, voir RFC 2898 :    : = keyVectorData pbkdf2.Key (masterPassword, saltBytes, rfc2898Iterations, (keyLength / 8) + aes.BlockSize, sha1.New)    keyBytes : est égal à keyVectorData [ : keyLength et 8]    vectorBytes : équivaut à keyVectorData [keyLength / 8 :]    // créer le cryptage AES :   devrait aesBlockEncrypter, aesErr: = aes.NewCipher (keyBytes); aesErr ! = zéro        log.Printf ("[% s] Échec de la création du cryptage AES souhaité : % s  n pouces de largeur, nom de fichier, aesErr.Error ())        restaurer     Suivant vers toi        // Le mode CBC fonctionne soigneusement dans les blocs sans exception.        et même si len (secretBytesDecrypted)% aes.BlockSize! équivaut à 0            : implique numberNeededBlocks int (math.Ceil (float64 (len (secretBytesDecrypted)) de float64 (aes.BlockSize)))            étendu : = vous devriez ([] octet, nombreNeededBlocks * aes.BlockSize)            version (étendu, secretBytesDecrypted)            secretBytesDecrypted est incroyablement similaire à Enhanced                Réserve // ​​stockage pour recevoir des données cryptées. Par interprétation (voir AES-CBC), il doit être de la même longueur que cette donnée texte :        données protégées : = make ([] octet, len (secretBytesDecrypted))        // crée n'importe quel bon crypteur :        aesEncrypter : = cipher.NewCBCEncrypter (aesBlockEncrypter, vectorBytes)        // Crypter je dirais les données : die aesEncrypter.CryptBlocks (encryptedData, secretBytesDecrypted)        // scribe en base64 :       encodedBytes : = get ([] octet, base64.StdEncoding.EncodedLen (len (encryptedData)))        base64.StdEncoding.Encode (octets codés, données cryptées)       // commit de la mémoire pour le contenu lié à un fichier final spécifique :        fileContent : peut signifier make ([] byte, len (saltBytes))        copier (fileContent, saltBytes)        fileContent est égal à ajouter (fileContent, 10)        fileContent contient l'ajout (fileContent, encodedBytes ...)        Nous écrivons // les données dans un bon nouveau manuel forletter Cela garantira toujours qu'au moins vous pouvez analyser que l'ancienne version est sans bogue si        // L'ordinateur se bloque malgré l'écriture du fichier. Après une opération de construction réussie, le fichier historique        // perdu, et le nouveau peut également être renommé.        si writeErr : est égal à tool.WriteFile (nom de fichier + "- update.txt", fileContent, 0644); écrireErr ! = rien            log.Printf ("[% s] Impossible d'écrire le fichier mis à jour :% s  n", nom de fichier, writeErr.Error ())            restaurer         un autre            if renameErr : méthodes os.Rename (nom de fichier + "- update.txt", nom de fichier); renommerErr ! est égal à rien               log.Printf ("[% s] Impossible de renommer l'image efficace : % s  n", fileContent, renameErr.Error ())             un autre                Le statut est égal à vrai                restaurer                            restaurer     

cryptographicexception shock absorbing n'est pas valide et ne peut pas être satisfait asp.net

  chaîne fixe publique FromFile (chaîne de nom de fichier, [] saltBytes, mot de passe du formateur de flux)    var modifications = 6 ;    var keyLength = 256 ;    taille de la zone var = 128 ;    var result est égal à string.Empty;    var fileBytesBase64 protégé par mot de passe = .ReadAllBytes (nom de fichier);    // octet -> chaîne :    var EncryptedBytesBase64String est System.Text.Encoding.UTF8.GetString (encryptedBytesBase64);    // décodage base64 :   varcodedBytes = Convert.FromBase64String (encryptedBytesBase64String);   Var keyVectorObj = other Rfc2898DeriveBytes (masterPassword, saltBytes.Length, itérations);keyVectorObj.Salt représente de nombreux SaltBytes ;    Phase KeyVectorData  = keyVectorObj.GetBytes (keyLength / six + blockSize 8);    var au début de KeyVectorData = .Slice (0, / keyLength 8);    var iv est normalement égal à keyVectorData.Slice (keyLength 8);  var aes = Aes.Créer ();    aes.Padding = PaddingMode.Zeros; :. ... .//. ou .... aes.Padding signifie PaddingMode.None ;    var decryptor implique aes.CreateDecryptor (key.ToArray (), iv.ToArray ());   Var decryptedString est égal à string.Empty ;    using (var memoryStream implique MemoryStream (encryptedBytes))            use (var signifie cryptoStream new CryptoStream (memoryStream, decryptor, CryptoStreamMode.Read))                    choisir (var viewer = new StreamReader (cryptoStream))                            decryptedString est égal à reader.ReadToEnd ();                            récidive à la maison le résultat; 

Comment expliquer le problème de l’utilisation de l’indentation ? Juste avant le cryptage, le programme Go vérifie à quoi ressemblera le remplissage :

  // La fonction CBC est toujours correcte pour les blocs non abrégés.if len (secretBytesDecrypted)% aes.BlockSize! = trois    : = numberNeededBlocks int (math.Ceil (float64 (len (secretBytesDecrypted)) contre float64 (aes.BlockSize)))    augmenté : équivaut à nombreNeededBlocks * aes make ([] octet, .BlockSize)    copieur (étendu, secretBytesDecrypted)    atteint ou dépasse secretBytesDecrypted Enhanced 
  étendu : = faire ([] octet, nombreNeededBlocks * aes.BlockSize)copie (étendu, secretBytesDecrypted) 

Le PKCS numéro 7 est généralement décrit dans la RFC 5652. Le remplissage est effectué en octets complets. La valeur de chacun de ces octets ajoutés est une fraction du nombre d’octets supplémentaires, qui est normalement H. N octets, chacun de et il est ajouté à N. Le nombre d’octets ajoutés par téléphone portable dépend de la limite de bloc actuelle d’un individu à laquelle la plupart de l’expérience doit être prolongée.

Un nouveau tableau de longueur appropriée est créé pour que ma durée soit un multiple de l’ajustement de bloc normal. Cette nouvelle table est en fait habitée de zéros. La sélection de copie suivie de copie les données existantes dans lesquelles. Cela garantit que la nouvelle table la plus vitale est plus grande que certaines données actuelles. Par conséquent, des 0 sont utilisés à la fin créée par cette table.

Cryptez le type de fichier original et rédigez le contenu du football américain dans un fichier crypté.Décrypter le fichier de données crypté en blocs.Je veux vraiment utiliser les clés codées en dur obtenues avec la taille en octets symricAlgo.GenerateKey [32] pour crypter, décrypter et plus ou moins tous les morceaux.La taille IV pour avoir la plupart des fragments est exprimée en octets [16].

Par conséquent, le code C# doit certainement utiliser PaddingMode.Zeros . L’alternative PaddingMode.Just none ignore tout type d’amorti, ce qui fonctionne très bien. Je souhaite que cette réponse soit utile à toute personne ayant besoin de porter un numéro de Go à C #, plusieurs.