Maison >développement back-end >C++ >Pourquoi le décryptage de ma chaîne est-il interrompu après la mise à niveau de .NET 5 vers .NET 6 ?

Pourquoi le décryptage de ma chaîne est-il interrompu après la mise à niveau de .NET 5 vers .NET 6 ?

DDD
DDDoriginal
2025-01-04 07:52:34320parcourir

Why is My String Decryption Cut Off After Upgrading from .NET 5 to .NET 6?

Problème de décryptage lors de la mise à niveau vers .NET 6 : classe de chiffrement de chaîne

Dans un projet .NET 5, une classe de chiffrement de chaîne similaire à celle fournie comme solution a bien fonctionné. Cependant, lors de la mise à niveau vers .NET 6, la chaîne déchiffrée a été coupée à un moment précis.

Analyse du problème

La cause fondamentale réside dans un changement radical entre . NET 5 et .NET 6. Plus précisément, le comportement de DeflateStream, GZipStream et CryptoStream a divergé de celui des autres Stream types.

Résolution

Ce changement affecte la méthode Decrypt dans la classe de chiffrement. Auparavant, lors de l'appel de cryptoStream.Read, il était prévu que l'opération se termine uniquement lorsque le tampon était rempli ou que le flux atteignait sa fin. Cependant, dans .NET 6, cryptoStream.Read se termine désormais même si un seul octet a été lu ou si le flux sous-jacent renvoie 0, indiquant qu'aucune donnée supplémentaire n'est disponible.

Par conséquent, la méthode Decrypt doit être mise à jour pour gérer correctement ce comportement. Une solution consiste à vérifier combien d'octets cryptoStream.Read lit réellement et à s'assurer que toutes les données sont lues :

var plainTextBytes = new byte[cipherTextBytes.Length];
var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);

Alternativement, CopyTo ou StreamReader peut être utilisé pour un code plus efficace et plus concis :

using (var plainTextStream = new MemoryStream())
{
    cryptoStream.CopyTo(plainTextStream);
    var plainTextBytes = plainTextStream.ToArray();
    return Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length);
}
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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn