2016-04-23 10 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

これを暗号化するには、この文字列をパラメータとしてに送信します。方法。 復号化の結果は15でなければなりませんが、代わりに次のようになります。1\05\0

なぜ理解できません。私を助けることができる人?

私はこの関数では整数だけを使うようにしましたが、私はまだ同じ問題を抱えています。復号化の出力は異なります。

+0

「\ 0」以外は正しいと思われますか? – Ian

+0

@Ian:それをintに変換できますか?だから私はそれを数字15として使うことができますか? – Bryan

+0

これは 'string'なので、コードのどこかでchar(おそらくUTF-8形式)を解釈(返す)していると思われますので、' 1'は '1 \ 0'と' 5' '5 \ 0'(リトルエンディアンのため)。その場合、 '\ 0'をすべて空の文字列に置き換えて返してください。 – Ian

答えて

4

文字列のUTF-16(Encoding.Unicode)表現を含むバッファをエンコードします(この文字列には1文字あたり2バイトを使用すると、\0がインターリーブされますが、デコードします) UTF-8(Encoding.UTF8)です。両方の方法で一貫している必要があります。