У меня есть два приложения: сервер и клиент, один из которых выполняется с одного компьютера, а другой - со второго компьютера, сервер передает данные с помощью соединения WebSocket, данные зашифровываются раньше отправленные клиенту, данные вносят его в клиентское приложение, но я пытаюсь его расшифровать с использованием того же защищенного метода и секретного ключа, но я не буду работать, он только расшифровывает его, когда оба приложения запускаются из такой же компьютер. Кто-нибудь знает, почему это работает, когда они запускаются с одного и того же компьютера, но не при запуске их с отдельных машин?Невозможно расшифровать данные на втором компьютере
Оба сервера и клиентского приложения используют этот же защищенный метод.
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);
Опять же, все это прекрасно работает ТОЛЬКО когда я использую серверные и клиентские приложения с одного и того же компьютера, но я пытаюсь использовать их отдельно, сервер на одной машине , а Клиент по другому не расшифровывает данные, даже если клиент успешно получает зашифрованные данные.
Пожалуйста, помогите!
Спасибо.
Вы уверены, что сообщение получено в неповрежденном состоянии на другом конце? – spender
просто догадка.<значения machineKey в файле web.config разные. если у вас нет машинного ключа, тогда сервер может генерировать его автоматически. Поэтому, если клиент и сервер одинаковы, он использует тот же машинный ключ, но на разных машинах он может использовать разные машинные клавиши ... попробуйте установить постоянный машинный ключ .. см. Http://aspnetresources.com/tools/machineKey –
robert