diff --git a/Ink Canvas/Helpers/DeviceIdentifier.cs b/Ink Canvas/Helpers/DeviceIdentifier.cs index a387a125..ae9e19d4 100644 --- a/Ink Canvas/Helpers/DeviceIdentifier.cs +++ b/Ink Canvas/Helpers/DeviceIdentifier.cs @@ -856,33 +856,21 @@ namespace Ink_Canvas.Helpers Array.Copy(encryptedData, 0, checksum, 0, 32); Array.Copy(encryptedData, 32, data, 0, data.Length); - // 使用SHA256生成解密密钥 - using (var sha256 = SHA256.Create()) + // 首先尝试使用新的固定密钥解密 + var stats = TryDecryptWithKey(data, checksum, "ICC_Usage_Stats_Fixed_Key_2024", filePath); + if (stats != null) { - byte[] keyBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(DeviceId + "ICC_Usage_Stats_Salt")); + return stats; + } - // XOR解密 - byte[] decryptedData = new byte[data.Length]; - for (int i = 0; i < data.Length; i++) - { - decryptedData[i] = (byte)(data[i] ^ keyBytes[i % keyBytes.Length]); - } - - // 验证校验 - byte[] computedChecksum = sha256.ComputeHash(decryptedData); - if (!checksum.SequenceEqual(computedChecksum)) - { - LogHelper.WriteLogToFile($"DeviceIdentifier | 加密文件校验和验证失败: {filePath}", LogHelper.LogType.Error); - return null; - } - - string json = Encoding.UTF8.GetString(decryptedData); - var stats = JsonConvert.DeserializeObject(json); - if (stats != null && !string.IsNullOrEmpty(stats.DeviceId)) - { - LogHelper.WriteLogToFile($"DeviceIdentifier | 从加密文件成功加载使用统计: {filePath}"); - return stats; - } + // 如果新密钥失败,尝试使用旧的设备ID密钥(向后兼容) + stats = TryDecryptWithKey(data, checksum, DeviceId + "ICC_Usage_Stats_Salt", filePath); + if (stats != null) + { + LogHelper.WriteLogToFile($"DeviceIdentifier | 使用旧密钥成功解密,将使用新密钥重新保存: {filePath}"); + // 使用新密钥重新保存,确保下次使用新密钥 + SaveUsageStatsToFile(filePath, stats); + return stats; } } } @@ -894,7 +882,48 @@ namespace Ink_Canvas.Helpers } /// - /// 保存使用统计到文件(加密) + /// 尝试使用指定密钥解密数据 + /// + private static UsageStats TryDecryptWithKey(byte[] data, byte[] checksum, string keyString, string filePath) + { + try + { + using (var sha256 = SHA256.Create()) + { + byte[] keyBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(keyString)); + + // XOR解密 + byte[] decryptedData = new byte[data.Length]; + for (int i = 0; i < data.Length; i++) + { + decryptedData[i] = (byte)(data[i] ^ keyBytes[i % keyBytes.Length]); + } + + // 验证校验 + byte[] computedChecksum = sha256.ComputeHash(decryptedData); + if (!checksum.SequenceEqual(computedChecksum)) + { + return null; // 校验失败,不是这个密钥 + } + + string json = Encoding.UTF8.GetString(decryptedData); + var stats = JsonConvert.DeserializeObject(json); + if (stats != null && !string.IsNullOrEmpty(stats.DeviceId)) + { + LogHelper.WriteLogToFile($"DeviceIdentifier | 使用密钥成功解密使用统计: {filePath}"); + return stats; + } + } + } + catch + { + // 解密失败,返回null + } + return null; + } + + /// + /// 保存使用统计到文件(使用固定密钥加密) /// private static void SaveUsageStatsToFile(string filePath, UsageStats stats) { @@ -910,10 +939,11 @@ namespace Ink_Canvas.Helpers string json = JsonConvert.SerializeObject(stats, Formatting.Indented); byte[] data = Encoding.UTF8.GetBytes(json); - // 使用SHA256生成加密密钥(基于设备ID) + // 使用固定密钥进行加密,不依赖设备ID using (var sha256 = SHA256.Create()) { - byte[] keyBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(DeviceId + "ICC_Usage_Stats_Salt")); + // 使用固定的应用程序密钥,确保跨设备更新时数据不会丢失 + byte[] keyBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes("ICC_Usage_Stats_Fixed_Key_2024")); // 简单的XOR加密 byte[] encryptedData = new byte[data.Length]; @@ -930,7 +960,7 @@ namespace Ink_Canvas.Helpers File.WriteAllBytes(filePath, finalData); - LogHelper.WriteLogToFile($"DeviceIdentifier | 加密使用统计已保存到: {filePath}"); + LogHelper.WriteLogToFile($"DeviceIdentifier | 使用固定密钥加密使用统计已保存到: {filePath}"); } } catch (Exception ex)