gpt4 book ai didi

c# - 无法在第二台计算机上解密数据

转载 作者:行者123 更新时间:2023-11-30 19:59:45 24 4
gpt4 key购买 nike

我有两个应用程序,服务器和客户端,一个在一台机器上运行,另一个在另一台机器上运行,服务器使用 WebSocket 连接传递数据,数据在发送到客户端之前经过加密,数据使其正确进入客户端应用程序,但我正在尝试使用相同的安全方法和 key 对其进行解密,但我不会工作,它只会在两个应用程序从同一台计算机运行时解密它。有没有人知道为什么它们在同一台机器上运行时有效,但在不同的机器上运行时却不行?

服务器和客户端应用程序都使用相同的安全方法。

using System.Security.Cryptography;

// ENCRYPT

static byte[] entropy = System.Text.Encoding.Unicode.GetBytes("MY SECRET KEY HERE");

public static string EncryptString(System.Security.SecureString input)
{
byte[] encryptedData = System.Security.Cryptography.ProtectedData.Protect(
System.Text.Encoding.Unicode.GetBytes(ToInsecureString(input)),
entropy,
System.Security.Cryptography.DataProtectionScope.CurrentUser);
return Convert.ToBase64String(encryptedData);
}

public static SecureString DecryptString(string encryptedData)
{
try
{
byte[] decryptedData = System.Security.Cryptography.ProtectedData.Unprotect(
Convert.FromBase64String(encryptedData),
entropy,
System.Security.Cryptography.DataProtectionScope.CurrentUser);
return ToSecureString(System.Text.Encoding.Unicode.GetString(decryptedData));
}
catch
{
return new SecureString();
}
}

public static SecureString ToSecureString(string input)
{
SecureString secure = new SecureString();
foreach (char c in input)
{
secure.AppendChar(c);
}
secure.MakeReadOnly();
return secure;
}

public static string ToInsecureString(SecureString input)
{
string returnValue = string.Empty;
IntPtr ptr = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(input);
try
{
returnValue = System.Runtime.InteropServices.Marshal.PtrToStringBSTR(ptr);
}
finally
{
System.Runtime.InteropServices.Marshal.ZeroFreeBSTR(ptr);
}
return returnValue;
}

// ENCRYPT ENDS

加密我使用的服务器上的数据:

string encryptedMessage = EncryptString(ToSecureString("Data to Encrypt Here"));

在我使用的客户端上解密数据:

SecureString data1 = DecryptString(dataEncryptedReceived);
IntPtr stringPointerData1 = Marshal.SecureStringToBSTR(data1);
string normalStringData1 = Marshal.PtrToStringBSTR(stringPointerData1);
Marshal.ZeroFreeBSTR(stringPointerData1);

同样,只有当我在同一台计算机上同时使用服务器和客户端应用程序时,这一切才能正常工作,但我尝试将它们分开使用,服务器在一台机器上,客户端在另一台机器上,它不会解密数据,即使客户端成功接收加密数据。

请帮忙!

谢谢。

最佳答案

您正在使用 System.Security.Cryptography.ProtectedData使用 Data Protection API (DPAPI) 的类在引擎盖下。 DPAPI 加密 key 在每台计算机上始终是唯一的,因此当您在计算机 A 上加密数据时,您使用的是 key A,而当您尝试在计算机 B 上解密数据时,您使用的是 key B。DPAPI 提供与 symmetric cipher 的接口(interface)。只有这样才能成功解密数据,您需要使用完全相同的 key 进行加密和解密。

我相信您应该更改您的代码以使用不同的加密算法,即 AES(由 System.Security.Cryptography.AesManaged 类实现),这将允许您在两台不同的机器之间共享 key 。

关于c# - 无法在第二台计算机上解密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23124000/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com