Menyelesaikan masalah Isu Potongan Penyahsulitan dalam .Net 6
Apabila menaik taraf daripada .Net 5 ke .Net 6, isu timbul apabila rentetan disulitkan menggunakan kelas penyulitan yang serupa dengan yang disediakan dalam soalan terputus semasa penyahsulitan. Isu ini hanya berlaku apabila menggunakan .Net 6, yang membawa kepada tingkah laku berikut:
Input: "12345678901234567890"
.NET 5 Output: "12345678901234567890"
.BERSIH 6 Output: "1234567890123456"
Perbezaan panjang ketara, dan puncanya berkaitan dengan pecahan .6 tingkah laku aliran seperti CryptoStream.
Memecahkan Perubahan dalam .Net 6
Bermula dari .Net 6, membaca daripada strim menggunakan Read() atau ReadAsync() kini selesai apabila salah satu daripada syarat berikut dipenuhi:
Kesan pada Kod Penyahsulitan
Dalam kod yang disediakan, bahagian berikut dalam kaedah Decrypt() ialah tidak terjejas:
var plainTextBytes = new byte[cipherTextBytes.Length]; var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
Sebelum .Net 6, gelagat CryptoStream memastikan penimbal telah diisi sepenuhnya atau penghujung strim dicapai sebelum operasi dianggap selesai. Walau bagaimanapun, ini tidak lagi berlaku dalam .Net 6, mengakibatkan potensi kehilangan data apabila penimbal penyahsulitan tidak diisi sepenuhnya.
Penyelesaian
Untuk menyelesaikan isu ini , anda boleh mengubah suai kaedah Decrypt() untuk memastikan semua bait adalah betul baca:
Gunakan Kaedah CopyTo():
using (var plainTextStream = new MemoryStream()) { cryptoStream.CopyTo(plainTextStream); var plainTextBytes = plainTextStream.ToArray(); return Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length); }
Gunakan StreamReader.ReadToEnd() :
using (var plainTextReader = new StreamReader(cryptoStream)) { return plainTextReader.ReadToEnd(); }
Atas ialah kandungan terperinci Mengapa Penyahsulitan .NET 6 Saya Memotong Rentetan Disulitkan dalam .NET 5?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!