4
我正在用MachineKey加密和解密Id。用MachineKey加密和解密c#
这是我的代码调用加密和解密功能:
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
我不明白为什么。任何人都可以帮助我?
我有trid在这个函数中只使用整数,但我仍然有同样的问题。解密的输出不同。
这似乎是正确的,除了'\ 0',不是吗? – Ian
@Ian:我可以将它转换为int吗?所以我可以使用它作为数字15? – Bryan
由于它是一个'string',我怀疑它在代码中的某处解释(返回)结果为char(可能是UTF-8格式),因此你的'1'表示为'1 \ 0'和'5' '5 \ 0'(因为Little Endian)。如果是这样的话,你只需要在返回之前将所有'\ 0'替换为空字符串。 – Ian