2016-04-23 115 views
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

這似乎是正確的,除了'\ 0',不是嗎? – Ian

+0

@Ian:我可以將它轉換爲int嗎?所以我可以使用它作爲數字15? – Bryan

+0

由於它是一個'string',我懷疑它在代碼中的某處解釋(返回)結果爲char(可能是UTF-8格式),因此你的'1'表示爲'1 \ 0'和'5' '5 \ 0'(因爲Little Endian)。如果是這樣的話,你只需要在返回之前將所有'\ 0'替換爲空字符串。 – Ian

回答

4

你有一個編碼不匹配,則編碼含有字符串的UTF-16(Encoding.Unicode)表示的緩衝液(其將交織\0正如所看到的給定的,它使用每個字符2個字節用於該字符串),但你解碼它作爲UTF-8(Encoding.UTF8)。你需要在兩種方法中保持一致。