Maison >développement back-end >C++ >Pourquoi mon décryptage .NET 6 coupe-t-il les chaînes chiffrées dans .NET 5 ?
Dépannage du problème de coupure de décryptage dans .Net 6
Lors de la mise à niveau de .Net 5 vers .Net 6, un problème survient lorsque les chaînes sont chiffrées à l'aide une classe de cryptage similaire à celle fournie dans la question est coupée lors du décryptage. Ce problème se produit uniquement lors de l'utilisation de .Net 6, entraînant le comportement suivant :
Entrée : "12345678901234567890"
Sortie .NET 5 : "12345678901234567890"
.NET 6 Sortie : "1234567890123456"
La différence de longueur est perceptible et la cause réside dans un changement radical dans .Net 6 lié à le comportement des flux comme CryptoStream.
Rupture de changement dans .Net 6
À partir de .Net 6, la lecture d'un flux à l'aide de Read() ou ReadAsync() se termine désormais lorsque l'un des les conditions suivantes sont remplies :
Impact sur le code de déchiffrement
Dans le code fourni, la section suivante de la méthode Decrypt() n'est pas affectée :
var plainTextBytes = new byte[cipherTextBytes.Length]; var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
Avant .Net 6, le comportement de CryptoStream garantissait que le tampon était complètement rempli ou que la fin du flux était atteinte avant que l'opération ne soit considérée comme terminée. Cependant, ce n'est plus le cas dans .Net 6, ce qui entraîne une perte potentielle de données lorsque le tampon de décryptage n'est pas entièrement rempli.
Solution
Pour résoudre ce problème , vous pouvez modifier la méthode Decrypt() pour vous assurer que tous les octets sont correctement lus :
Utilisez Méthode CopyTo() :
using (var plainTextStream = new MemoryStream()) { cryptoStream.CopyTo(plainTextStream); var plainTextBytes = plainTextStream.ToArray(); return Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length); }
Utilisez StreamReader.ReadToEnd() :
using (var plainTextReader = new StreamReader(cryptoStream)) { return plainTextReader.ReadToEnd(); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!