Maison >développement back-end >C++ >Pourquoi mon déchiffrement de chaîne .NET 6 est-il tronqué après la mise à niveau depuis .NET 5 ?

Pourquoi mon déchiffrement de chaîne .NET 6 est-il tronqué après la mise à niveau depuis .NET 5 ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-01 09:52:09152parcourir

Why is my .NET 6 string decryption truncated after upgrading from .NET 5?

Problème lors de la mise à niveau vers .Net 6 - Chaîne de chiffrement

Lors de la mise à niveau d'un projet de .Net 5 vers .Net 6, un problème survient problème de déchiffrement des chaînes à l'aide d'une classe de cryptage/déchiffrement. Le résultat est une chaîne déchiffrée coupée à un certain point en fonction de la longueur de la chaîne d'entrée.

Cause

Un changement dans le comportement des classes liées au flux comme CryptoStream, dans .Net 6. Dans les versions précédentes, ces classes lisaient tous les octets du tampon ou atteignaient la fin du flux avant de terminer l'opération de lecture. Dans .Net 6, ils se terminent après avoir lu au moins un octet ou après avoir renvoyé 0 à partir d'un appel de lecture du flux sous-jacent.

Code concerné

Le problème se pose dans la méthode Decrypt de la classe de chiffrement, en particulier lors de la lecture des octets déchiffrés de CryptoStream à l'aide d'un tampon corrigé :

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

Solution

Pour résoudre le problème, il est nécessaire de vérifier le nombre d'octets réellement lus par CryptoStream et d'ajuster la lecture en conséquence. Cela peut être fait en vérifiant la propriété length du MemoryStream après l'opération de lecture.

Alternativement, une meilleure approche consiste à utiliser la méthode CopyTo du CryptoStream ou à créer un StreamReader directement au-dessus du CryptoStream. Ces approches garantissent que tous les octets déchiffrés sont lus et renvoyés :

// Usando CopyTo
using (var plainTextStream = new MemoryStream())
{
    cryptoStream.CopyTo(plainTextStream);
    var plainTextBytes = plainTextStream.ToArray();
    return Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length);
}

// Usando StreamReader
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