使用C#中的MachineKey加密和解密

时间:2016-04-23 15:17:57

标签: c# asp.net machinekey

我尝试使用MachineKey加密和解密Id。

这是我调用加密和解密函数的代码:

 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 个答案:

答案 0 :(得分:5)

您的编码不匹配,您编码一个缓冲区,其中包含字符串的UTF-16(Encoding.Unicode)表示形式(如果您使用每个字符使用2个字节,则会交错\0那个字符串)但你把它解码为UTF-8(Encoding.UTF8)。你需要在两种方法中保持一致。