Шифрование и дешифрование с помощью 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). Вы должны быть последовательными в обоих методах.

Другие вопросы по тегам