在C#中使用MachineKey进行加密和解密

Bry*_*yan 5 c# asp.net machinekey

我正在尝试使用MachineKey加密和解密ID。

这是我的调用加密和解密功能的代码:

 var encryptedId = Encryption.Protect(profileId.ToString(), UserId);
 var decryptedId = Encryption.UnProtect(encryptedId, UserId);
Run Code Online (Sandbox Code Playgroud)

功能如下:

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);
}
Run Code Online (Sandbox Code Playgroud)

该Protect方法的输入为15。这将导致EncryptedId变量包含以下字符串:6wOttbtJoVBV7PxhVWXGz4AQVYcuyHvTyJhAoPu4Okd2aKhhCGbKlK_T4q3GgirotfOZYZXke0pMdgwSmC5vxg2

为了对此进行加密,我将此字符串作为参数发送给该UnProtect方法。解密的结果应为15,但改为:1\05\0

我不明白为什么。我试图在此函数中仅使用整数,但是我仍然遇到相同的问题。解密的输出不同。

Ale*_* K. 6

您的编码不匹配,对包含Encoding.Unicode字符串的UTF-16()表示形式的缓冲区进行了编码(\0鉴于该字符串每个字符使用2个字节,该字符串将交错显示),但将其解码为UTF-8(Encoding.UTF8) 。两种方法都需要保持一致。