C#中使用MachineKey加密解密
Encrypt and decrypt with MachineKey in C#
我正在尝试使用 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[=15=]
我不明白为什么。我试图在这个函数中只使用整数,但我仍然遇到同样的问题。解密的输出不同。
您的编码不匹配,您对包含字符串的 UTF-16 (Encoding.Unicode
) 表示形式的缓冲区进行编码(如您所见,它将交错 [=11=]
,因为它每个使用 2 个字节该字符串的字符),但您将其解码为 UTF-8 (Encoding.UTF8
)。您需要在这两种方法中保持一致。
我正在尝试使用 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[=15=]
我不明白为什么。我试图在这个函数中只使用整数,但我仍然遇到同样的问题。解密的输出不同。
您的编码不匹配,您对包含字符串的 UTF-16 (Encoding.Unicode
) 表示形式的缓冲区进行编码(如您所见,它将交错 [=11=]
,因为它每个使用 2 个字节该字符串的字符),但您将其解码为 UTF-8 (Encoding.UTF8
)。您需要在这两种方法中保持一致。