From 818365b816d9a586ac1b40752c242d9bf23aec84 Mon Sep 17 00:00:00 2001 From: DismissedLight <1686188646@qq.com> Date: Sat, 11 Feb 2023 12:32:00 +0800 Subject: [PATCH] fix #486 --- .../Snap.Hutao/Core/CoreEnvironment.cs | 3 +- .../Snap.Hutao/Core/LifeCycle/Activation.cs | 5 +++ .../Snap.Hutao/LaunchGameWindow.xaml | 7 ++-- .../Binding/Cultivation/CultivateEntry.cs | 13 ++++++ .../Binding/Cultivation/CultivateItem.cs | 19 ++------- .../Model/Binding/Cultivation/DaysOfWeek.cs | 35 ++++++++++++++++ .../Snap.Hutao/Model/Metadata/Material.cs | 24 +++++++++++ .../Resource/Localization/SH.Designer.cs | 36 ++++++++++++++++ .../Snap.Hutao/Resource/Localization/SH.resx | 12 ++++++ .../Service/Cultivation/CultivationService.cs | 2 +- .../Service/Game/Package/PackageConverter.cs | 4 +- src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj | 6 --- .../View/Dialog/LoginMihoyoBBSDialog.xaml | 31 -------------- .../View/Dialog/LoginMihoyoBBSDialog.xaml.cs | 41 ------------------ .../Snap.Hutao/View/Page/CultivationPage.xaml | 8 +++- .../ViewModel/CultivationViewModel.cs | 5 ++- .../Snap.Hutao/ViewModel/TestViewModel.cs | 38 ----------------- .../Web/Hoyolab/Passport/PassportClient2.cs | 22 ---------- .../Hoyolab/Passport/RSAEncryptedString.cs | 42 ------------------- 19 files changed, 147 insertions(+), 206 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/DaysOfWeek.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml delete mode 100644 src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/RSAEncryptedString.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs b/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs index 53c5eb77..845c79c7 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/CoreEnvironment.cs @@ -8,6 +8,7 @@ using Snap.Hutao.Extension; using Snap.Hutao.Web.Hoyolab.DynamicSecret; using System.Collections.Immutable; using System.IO; +using System.Text.Encodings.Web; using System.Text.Json.Serialization.Metadata; using Windows.ApplicationModel; @@ -87,7 +88,7 @@ internal static class CoreEnvironment public static readonly JsonSerializerOptions JsonOptions = new() { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - Encoder = new JsonTextEncoder(), + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, PropertyNameCaseInsensitive = true, WriteIndented = true, TypeInfoResolver = new DefaultJsonTypeInfoResolver() diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs index 172de3c2..e2f91506 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/Activation.cs @@ -37,6 +37,11 @@ internal static class Activation /// 是否提升了权限 public static bool GetElevated() { + if (System.Diagnostics.Debugger.IsAttached) + { + return true; + } + using (WindowsIdentity identity = WindowsIdentity.GetCurrent()) { WindowsPrincipal principal = new(identity); diff --git a/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml b/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml index 941e594d..e3d1c358 100644 --- a/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml +++ b/src/Snap.Hutao/Snap.Hutao/LaunchGameWindow.xaml @@ -6,6 +6,7 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mxi="using:Microsoft.Xaml.Interactivity" xmlns:shcb="using:Snap.Hutao.Control.Behavior" + xmlns:shcm="using:Snap.Hutao.Control.Markup" xmlns:shv="using:Snap.Hutao.ViewModel" mc:Ignorable="d"> @@ -28,7 +29,7 @@ Margin="12,0,0,0" VerticalAlignment="Center" Style="{StaticResource CaptionTextBlockStyle}" - Text="选择账号并启动" + Text="{shcm:ResourceString Name=LaunchGameTitle}" TextWrapping="NoWrap"/> @@ -44,7 +45,7 @@ + Text="{Binding AttachUid, TargetNullValue={shcm:ResourceString Name=ViewPageLaunchGameSwitchAccountAttachUidNull}}"/> @@ -56,6 +57,6 @@ Margin="16" HorizontalAlignment="Stretch" Command="{Binding LaunchCommand}" - Content="启动游戏"/> + Content="{shcm:ResourceString Name=ViewPageLaunchGameAction}"/> diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateEntry.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateEntry.cs index d8b56b93..f4d3b33d 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateEntry.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateEntry.cs @@ -41,4 +41,17 @@ public class CultivateEntry : ItemBase /// 实体 /// public List Items { get; set; } = default!; + + /// + /// 是否为今日的材料 + /// + public bool IsToday { get => Items.Any(i => i.IsToday); } + + /// + /// 星期中的日期 + /// + public DaysOfWeek DaysOfWeek + { + get => Items.FirstOrDefault(i => i.DaysOfWeek != DaysOfWeek.Any)?.DaysOfWeek ?? DaysOfWeek.Any; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateItem.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateItem.cs index 05ebfb3a..19c1519c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateItem.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/CultivateItem.cs @@ -24,9 +24,6 @@ public class CultivateItem : ObservableObject Inner = inner; Entity = entity; isFinished = Entity.IsFinished; - IsToday = inner.IsTodaysItem(); - - FinishStateCommand = new RelayCommand(FlipIsFinished); } /// @@ -39,11 +36,6 @@ public class CultivateItem : ObservableObject /// public Entity.CultivateItem Entity { get; } - /// - /// 调整完成状态命令 - /// - public ICommand FinishStateCommand { get; } - /// /// 是否完成此项 /// @@ -61,15 +53,10 @@ public class CultivateItem : ObservableObject /// /// 是否为今日物品 /// - public bool IsToday { get; } + public bool IsToday { get => Inner.IsTodaysItem(); } /// - /// 对应背包物品的个数 + /// 星期中的日期 /// - public uint InventoryItemCount { get; set; } - - private void FlipIsFinished() - { - IsFinished = !IsFinished; - } + public DaysOfWeek DaysOfWeek { get => Inner.GetDaysOfWeek(); } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/DaysOfWeek.cs b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/DaysOfWeek.cs new file mode 100644 index 00000000..287b66ba --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Model/Binding/Cultivation/DaysOfWeek.cs @@ -0,0 +1,35 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Core.Annotation; + +namespace Snap.Hutao.Model.Binding.Cultivation; + +/// +/// 游戏内星期中的天 +/// +public enum DaysOfWeek +{ + /// + /// 任意 + /// + Any, + + /// + /// 周一/周四/周日 + /// + [LocalizationKey("ModelBindingCultivationDaysOfWeek14")] + MondayAndThursday, + + /// + /// 周二/周五/周日 + /// + [LocalizationKey("ModelBindingCultivationDaysOfWeek25")] + TuesdayAndFriday, + + /// + /// 周三/周六/周日 + /// + [LocalizationKey("ModelBindingCultivationDaysOfWeek36")] + WednesdayAndSaturday, +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Material.cs b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Material.cs index 79dac9ef..1f510e89 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Material.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Metadata/Material.cs @@ -143,4 +143,28 @@ public class Material _ => false, }; } + + /// + /// 获取物品对应的 DaysOfWeek + /// + /// DaysOfWeek + public Binding.Cultivation.DaysOfWeek GetDaysOfWeek() + { + if (MondayThursdayItems.Contains(Id)) + { + return Binding.Cultivation.DaysOfWeek.MondayAndThursday; + } + + if (TuesdayFridayItems.Contains(Id)) + { + return Binding.Cultivation.DaysOfWeek.TuesdayAndFriday; + } + + if (WednesdaySaturdayItems.Contains(Id)) + { + return Binding.Cultivation.DaysOfWeek.WednesdayAndSaturday; + } + + return Binding.Cultivation.DaysOfWeek.Any; + } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs index ce4382f5..8b71a4e4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs @@ -267,6 +267,42 @@ namespace Snap.Hutao.Resource.Localization { } } + /// + /// 查找类似 选择账号并启动 的本地化字符串。 + /// + internal static string LaunchGameTitle { + get { + return ResourceManager.GetString("LaunchGameTitle", resourceCulture); + } + } + + /// + /// 查找类似 周一/周四/周日 的本地化字符串。 + /// + internal static string ModelBindingCultivationDaysOfWeek14 { + get { + return ResourceManager.GetString("ModelBindingCultivationDaysOfWeek14", resourceCulture); + } + } + + /// + /// 查找类似 周二/周五/周日 的本地化字符串。 + /// + internal static string ModelBindingCultivationDaysOfWeek25 { + get { + return ResourceManager.GetString("ModelBindingCultivationDaysOfWeek25", resourceCulture); + } + } + + /// + /// 查找类似 周三/周六/周日 的本地化字符串。 + /// + internal static string ModelBindingCultivationDaysOfWeek36 { + get { + return ResourceManager.GetString("ModelBindingCultivationDaysOfWeek36", resourceCulture); + } + } + /// /// 查找类似 第 {0} 层 的本地化字符串。 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index c7e329b2..5e5b8880 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -186,6 +186,18 @@ 导入 + + 选择账号并启动 + + + 周一/周四/周日 + + + 周二/周五/周日 + + + 周三/周六/周日 + 第 {0} 层 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs index fd1e78f4..fe224a48 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/CultivationService.cs @@ -187,7 +187,7 @@ internal class CultivationService : ICultivationService } return results - .OrderByDescending(e => e.Items.Any(i => i.IsToday)) + .OrderByDescending(e => e.IsToday) .ToObservableCollection(); } } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs index 1c03c6ea..a67c05bf 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/Package/PackageConverter.cs @@ -245,8 +245,8 @@ internal class PackageConverter return false; } - // Ensure cache folder - string cacheFolder = Path.Combine(gameFolder, "Screenshot", "HutaoCache"); + // Cache folder + string cacheFolder = Path.Combine(Core.CoreEnvironment.DataFolder, "ServerCache"); // 执行下载与移动操作 foreach (ItemOperationInfo info in operations) diff --git a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj index 7f154c47..2cced7f3 100644 --- a/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj +++ b/src/Snap.Hutao/Snap.Hutao/Snap.Hutao.csproj @@ -90,7 +90,6 @@ - @@ -267,11 +266,6 @@ MSBuild:Compile - - - MSBuild:Compile - - MSBuild:Compile diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml b/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml deleted file mode 100644 index 0773cf7a..00000000 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - diff --git a/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml.cs b/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml.cs deleted file mode 100644 index f3a78b66..00000000 --- a/src/Snap.Hutao/Snap.Hutao/View/Dialog/LoginMihoyoBBSDialog.xaml.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. See LICENSE in the project root for license information. - -using Microsoft.UI.Xaml.Controls; -using Snap.Hutao.Web.Hoyolab.Passport; - -namespace Snap.Hutao.View.Dialog; - -/// -/// ¼Ի -/// -public sealed partial class LoginMihoyoBBSDialog : ContentDialog -{ - /// - /// һµĵ¼Ի - /// - /// - public LoginMihoyoBBSDialog() - { - InitializeComponent(); - XamlRoot = Ioc.Default.GetRequiredService().Content.XamlRoot; - } - - /// - /// 첽ȡû˺ - /// - /// ˺ - public async Task>> GetInputAccountPasswordAsync() - { - await ThreadHelper.SwitchToMainThreadAsync(); - bool result = await ShowAsync() == ContentDialogResult.Primary; - - Dictionary data = new() - { - { "account", RSAEncryptedString.Encrypt(AccountTextBox.Text) }, - { "password", RSAEncryptedString.Encrypt(PasswordTextBox.Password) }, - }; - - return new(result, data); - } -} diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/CultivationPage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/CultivationPage.xaml index 9f2cd33f..ea5cf113 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/CultivationPage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/CultivationPage.xaml @@ -37,6 +37,12 @@ x:Key="BoolToStyleSelector" FalseValue="{StaticResource BodyTextBlockStyle}" TrueValue="{StaticResource BaseTextBlockStyle}"/> + + + + + + @@ -165,7 +171,7 @@ Margin="6,0,0,0" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" - Background="Transparent" + Background="{Binding IsToday, Converter={StaticResource BoolToBrushSelector}}" Command="{Binding Path=DataContext.FinishStateCommand, Source={StaticResource BindingProxy}}" CommandParameter="{Binding}" Style="{StaticResource ButtonRevealStyle}"> diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs index b0e20eda..3358901e 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/CultivationViewModel.cs @@ -2,7 +2,10 @@ // Licensed under the MIT license. using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.WinUI.UI; using Microsoft.Extensions.DependencyInjection; +using Snap.Hutao.Extension; +using Snap.Hutao.Model; using Snap.Hutao.Model.Binding.Cultivation; using Snap.Hutao.Model.Entity; using Snap.Hutao.Service.Abstraction; @@ -186,8 +189,6 @@ internal class CultivationViewModel : Abstraction.ViewModel if (project != null) { List materials = await metadataService.GetMaterialsAsync().ConfigureAwait(false); - Dictionary idAvatarMap = await metadataService.GetIdToAvatarMapAsync().ConfigureAwait(false); - Dictionary idWeaponMap = await metadataService.GetIdToWeaponMapAsync().ConfigureAwait(false); ObservableCollection entries = await cultivationService .GetCultivateEntriesAsync(project) diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs index 9e83d848..15739654 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/TestViewModel.cs @@ -31,7 +31,6 @@ internal class TestViewModel : Abstraction.ViewModel ShowCommunityGameRecordDialogCommand = new AsyncRelayCommand(ShowCommunityGameRecordDialogAsync); ShowAdoptCalculatorDialogCommand = new AsyncRelayCommand(ShowAdoptCalculatorDialogAsync); - DangerousLoginMihoyoBbsCommand = new AsyncRelayCommand(DangerousLoginMihoyoBbsAsync); DownloadStaticFileCommand = new AsyncRelayCommand(DownloadStaticFileAsync); } @@ -45,11 +44,6 @@ internal class TestViewModel : Abstraction.ViewModel /// public ICommand ShowAdoptCalculatorDialogCommand { get; } - /// - /// Dangerous 登录米游社命令 - /// - public ICommand DangerousLoginMihoyoBbsCommand { get; } - /// /// 下载资源文件命令 /// @@ -69,38 +63,6 @@ internal class TestViewModel : Abstraction.ViewModel await new AdoptCalculatorDialog().ShowAsync(); } - private async Task DangerousLoginMihoyoBbsAsync() - { - // ContentDialog must be created by main thread. - await ThreadHelper.SwitchToMainThreadAsync(); - (bool isOk, Dictionary? data) = await new LoginMihoyoBBSDialog().GetInputAccountPasswordAsync().ConfigureAwait(false); - - if (isOk) - { - (Response? resp, Aigis? aigis) = await serviceProvider - .GetRequiredService() - .LoginByPasswordAsync(data, CancellationToken.None) - .ConfigureAwait(false); - - if (resp != null) - { - if (resp.IsOk()) - { - Cookie cookie = Cookie.FromLoginResult(resp.Data); - - await serviceProvider - .GetRequiredService() - .ProcessInputCookieAsync(cookie) - .ConfigureAwait(false); - } - - if (resp.ReturnCode == (int)KnownReturnCode.RET_NEED_AIGIS) - { - } - } - } - } - private async Task DownloadStaticFileAsync() { BitsManager bitsManager = serviceProvider.GetRequiredService(); diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs index 81d2ad9f..6ce1be1f 100644 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs +++ b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/PassportClient2.cs @@ -35,28 +35,6 @@ internal class PassportClient2 this.logger = logger; } - /// - /// 异步账密登录 - /// - /// 账密数据 - /// 取消令牌 - /// 登录数据 - [ApiInformation(Salt = SaltType.PROD)] - public async Task?, Aigis?>> LoginByPasswordAsync(Dictionary data, CancellationToken token) - { - HttpResponseMessage resp = await httpClient - .UseDynamicSecret(DynamicSecretVersion.Gen2, SaltType.PROD, true) - .PostAsJsonAsync(ApiEndpoints.AccountLoginByPassword, data, options, token) - .ConfigureAwait(false); - - _ = resp.Headers.TryGetValues("X-Rpc-Aigis", out IEnumerable? values); - - Aigis? aigis = values != null && values.Any() ? JsonSerializer.Deserialize(values.Single(), options) : null; - Response? body = await resp.Content.ReadFromJsonAsync>(options, token).ConfigureAwait(false); - - return new(body, aigis); - } - /// /// V1Stoken 登录 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/RSAEncryptedString.cs b/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/RSAEncryptedString.cs deleted file mode 100644 index 3c1c0d29..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Web/Hoyolab/Passport/RSAEncryptedString.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using System.Security.Cryptography; -using System.Text; - -namespace Snap.Hutao.Web.Hoyolab.Passport; - -/// -/// 支持RSA转换 -/// -internal class RSAEncryptedString -{ - private const string RsaPublicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDvekdPMHN3AYhm/vktJT+YJr7cI5DcsNKqdsx5DZX0gDuWFuIjzdwButrIYPNmRJ1G8ybDIF7oDW2eEpm5sMbL9zs\n9ExXCdvqrn51qELbqj0XxtMTIpaCHFSI50PfPpTFV9Xt/hmyVwokoOXFlAEgCn+Q\nCgGs52bFoYMtyi+xEQIDAQAB\n"; - - private readonly string encryptedSource; - - private RSAEncryptedString(string encryptedSource) - { - this.encryptedSource = encryptedSource; - } - - public static implicit operator string(RSAEncryptedString encryptedString) - { - return encryptedString.encryptedSource; - } - - /// - /// 加密 - /// - /// 源 - /// 字节数组 - public static RSAEncryptedString Encrypt(string source) - { - RSA rsa = RSA.Create(); - rsa.ImportFromPem($"-----BEGIN PUBLIC KEY-----\n{RsaPublicKey}-----END PUBLIC KEY-----"); - byte[] bytes = Encoding.UTF8.GetBytes(source); - string encrypted = Convert.ToBase64String(rsa.Encrypt(bytes, RSAEncryptionPadding.Pkcs1)); - - return new(encrypted); - } -} \ No newline at end of file