Шифрование и дешифрование с помощью MachineKey C#
Я пытаюсь зашифровать и расшифровать идентификатор с помощью MachineKey.
Вот мой код, который вызывает функции шифрования и дешифрования:
var encryptedId = Encryption.Protect(profileId.ToString(), UserId);
var decryptedId = Encryption.UnProtect(encryptedId, UserId);
Вот функции:
public static string Protect(string text, string purpose)
{
if(string.IsNullOrEmpty(text))
{
return string.Empty;
}
byte[] stream = Encoding.Unicode.GetBytes(text);
byte[] encodedValues = MachineKey.Protect(stream, purpose);
return HttpServerUtility.UrlTokenEncode(encodedValues);
}
public static string UnProtect(string text, string purpose)
{
if(string.IsNullOrEmpty(text))
{
return string.Empty;
}
byte[] stream = HttpServerUtility.UrlTokenDecode(text);
byte[] decodedValues = MachineKey.Unprotect(stream, purpose);
return Encoding.UTF8.GetString(decodedValues);
}
Вход в Protect
Метод равен 15. Это приводит к тому, что переменная encryptedId содержит следующую строку: 6wOttbtJoVBV7PxhVWXGz4AQVYcuyHvTyJhAoPu4Okd2aKhhCGbKlK_T4q3GgirotfOZYZXke0pMdgwSmC5vxg2
Чтобы зашифровать это, я отправляю эту строку в качестве параметра UnProtect
метод. Результат расшифровки должен быть 15, но вместо этого: 1\05\0
Я не могу понять почему. Кто-нибудь, кто может мне помочь?
Я попытался использовать только целые числа в этой функции, но я все еще получил ту же проблему. Вывод расшифровки отличается.
1 ответ
У вас несоответствие кодировки, вы кодируете буфер, содержащий UTF-16 (Encoding.Unicode
) представление строки (которая будет чередовать \0
как вы видите, учитывая, что он использует 2 байта на символ для этой строки), но вы декодируете его как UTF-8 (Encoding.UTF8
). Вы должны быть последовательными в обоих методах.