2016-10-04 7 views
1

Я пытаюсь использовать параметр varbinary с Dapper.NET следующимИспользование VARBINARY параметра с Dapper.NET

string secret = "secret"; 

// from SELECT ENCRYPTBYPASSPHRASE('secret', N'xx') >>; 
string ciphertext = "0x01000000393FE233AE939CA815AB744DDC39667860B3B630C82F36F7"; 
using (var conn = new SqlConnection(...)) 
{ 
    var result = conn.ExecuteScalar(@"SELECT CONVERT(NVARCHAR(4000), DECRYPTBYPASSPHRASE(@secret, @ciphertext)) as decrypted", 
     new 
     { 
      secret, 
      ciphertext = Encoding.Unicode.GetBytes(ciphertext) 
     }); 
} 

Однако результат null. Но он возвращает действительный результат, если я запускаю SQL напрямую, например.

SELECT CONVERT(NVARCHAR(40), DECRYPTBYPASSPHRASE('secret', 0x01000000393FE233AE939CA815AB744DDC39667860B3B630C82F36F7)) 

возвращает xx который является зашифрованным текстом.

Любая идея, что я делаю неправильно?

+1

' Encoding.Unicode.GetBytes' собирается получить вам массив байтов * строкового представления * вашего шестнадцатеричного значения – Rob

+1

Используйте [this] (http://stackoverflow.com/questions/321370/how-can-i-convert- a-hex-string-to-a-byte-array), чтобы получить правильное значение для 'enciphertext' – Rob

ответ

0

Просто так кто-то находит полезным, следующий проработанный (Спасибо @Rob комментариев выше)

public string Encrypt(string secret, string unprotectedText) 
{ 
    using (var conn = new SqlConnection(...)) 
    { 
     var x = conn.ExecuteScalar(@"SELECT ENCRYPTBYPASSPHRASE(@secret, @text)", 
      new { secret, text }); 

     return ByteArrayToString((byte[])x); 
    } 
} 

public string Decrypt(string secret, string ciphertext) 
{ 
    using (var conn = new SqlConnection(...)) 
    { 
     return conn.ExecuteScalar(@"SELECT CONVERT(NVARCHAR(4000), DECRYPTBYPASSPHRASE(@secret, @ciphertext))", 
      new { secret, ciphertext = StringToByteArray(ciphertext) }).ToString(); 
    } 
} 

и функции шестнадцатеричной к байт и байт-в-шестнадцатеричной являются

public static byte[] StringToByteArray(string hex) 
{ 
    int startIndex = 0; 
    if (hex.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase)) 
     startIndex = 2; 

    return Enumerable.Range(startIndex, hex.Length - startIndex) 
        .Where(x => x % 2 == 0) 
        .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) 
        .ToArray(); 
} 

public static string ByteArrayToString(byte[] arr) 
{ 
    return "0x" + BitConverter.ToString(arr).Replace("-", String.Empty); 
}