EncryptByPassPhrase键以字节为单位

时间:2014-08-05 16:54:22

标签: c# sql-server-2008 des encryption-symmetric

我想在SQL SERVER(我在这里找到http://msdn.microsoft.com/en-us/library/ms190357.aspx)中使用EncryptByPassPhrase来通过加密来更新表中的现有值。但是,密码(或密钥)以字节为单位,例如:

private static readonly byte[] TrippleDesKey = new byte[] { 0xF1, 0x07, 0xE6, 0x13, 0xBA, 0x85, 0x7F, 0xDC, 0x6D, 0x85, 0x67, 0x9B, 0x68, 0x7A, 0xC7, 0x1F, 0x10, 0xBA, 0xB0, 0x2F, 0xA2, 0xAE, 0xDA, 0xEA };

我想使用EncryptByPassPhrase变量应用TrippleDesKey

有关我如何做到这一点的任何建议?我假设如果我将TrippleDesKey变量转换为字符串,我可以简单地使用它EncryptByPassPhrase

我尝试转换TrippleDesKey变量,例如

string result = System.Text.Encoding.UTF8.GetString(TrippleDesKey); 
Console.WriteLine(result);

并且ouptut是�����m�g�hz���/����

我在EncryptByPassPhrase中使用了�����ï�g�hz���/����但没有加密值,即返回空字符串

2 个答案:

答案 0 :(得分:0)

EncryptByPassPhrase可以接受二进制(字节)值作为密码,因此您应该能够将TrippleDesKey作为参数传递给存储过程或语句。我把它扔在一起作为一个例子,但它应该很接近......

string commandText = "UPDATE MyTable SET EncryptedData = EncryptByPassPhrase(@DesKey, EncryptedData ) WHERE CustomerID = @ID";

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand(commandText, connection);
    command.Parameters.Add("@DesKey", SqlDbType.VarBinary);
    command.Parameters["@DesKey"].Value = TrippleDesKey;

    command.Parameters.Add("@ID", SqlDbType.Int);
    command.Parameters["@ID"].Value = customerID;

    try
    {
        connection.Open();
        Int32 rowsAffected = command.ExecuteNonQuery();
        Console.WriteLine("RowsAffected: {0}", rowsAffected);
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

答案 1 :(得分:0)

您只需将字节十六进制值加入一个值并使用它:

new byte[] { 0xF1, 0x07, 0xE6, 0x13, 0xBA, 0x85, 0x7F, 0xDC, 0x6D, 0x85, 0x67, 0x9B, 0x68, 0x7A, 0xC7, 0x1F, 0x10, 0xBA, 0xB0, 0x2F, 0xA2, 0xAE, 0xDA, 0xEA } = 0xF107E613BA857FDC6D85679B687AC71F10BAB02FA2AEDAEA

然后像这样使用它:

EncryptByPassPhrase( 0xF107E613BA857FDC6D85679B687AC71F10BAB02FA2AEDAEA, 'test')