2012-03-13 50 views
0

他正在研究如何在我的应用程序中实现加密算法。他曾看过RC2。RC2 Crypt SQL Server和C#

,一方面,我设法加密和从C#解密。

在另一方面,我也设法加密和从SQL Server解密。

但是从SQL Server什么加密的,我不能从C#破译它,也当你从C#加密的,我不能从SQL Server破译。

当然,加密密钥和初始向量是相同的。

我猜是什么让SQL服务器数据加密不是简单的二进制加密,但增加了更多的东西。


编辑: C#代码:

public static byte[] Cifrar(string dato, string clave, string vectorInicial) 
    { 
     byte[] plainText = Encoding.ASCII.GetBytes(dato); 
     byte[] keys = Encoding.ASCII.GetBytes(clave); 
     byte[] vecI = Encoding.ASCII.GetBytes(vectorInicial); 
     MemoryStream memdata = new MemoryStream(); 


     RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider(); 
     ICryptoTransform transform; 
     rc2.Mode = CipherMode.CBC; 
     transform = rc2.CreateEncryptor(keys, vecI); 

     CryptoStream encStream = new CryptoStream(memdata,transform,CryptoStreamMode.Write); 


     encStream.Write(plainText, 0, plainText.Length); 
     encStream.Close(); 

     return memdata.ToArray(); 
    } 

    public static string Descrifrar(byte[] dato,string clave, string vectorInicial) 
    { 
     byte[] keys = Encoding.ASCII.GetBytes(clave); 
     byte[] vecI = Encoding.ASCII.GetBytes(vectorInicial); 
     MemoryStream memdata = new MemoryStream(); 

     RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider(); 
     ICryptoTransform transform; 
     rc2.Mode = CipherMode.CBC; 
     transform = rc2.CreateDecryptor(keys, vecI); 

     CryptoStream encStream = new CryptoStream(memdata,transform,CryptoStreamMode.Write); 


     encStream.Write(dato, 0, dato.Length); 
     encStream.Close(); 

     return Encoding.ASCII.GetString(memdata.ToArray()); 

    } 

对于加密使用:

CifradoRC2.Cifrar("Perico", "sdsdfdsf323", "huihuihuih123"); 

T-SQL代码:

CREATE SYMMETRIC KEY NuevaClaveDeCifrado WITH IDENTITY_VALUE = 'huihuihuih123',ALGORITHM = RC2,KEY_SOURCE = 'sdsdfdsf323' ENCRYPTION BY Password = 'dsjdkflJ435907NnmM#sX003'; 

CREATE PROCEDURE OpenSqlKeys 
AS 
BEGIN  
    SET NOCOUNT ON; 
    BEGIN TRY 
      OPEN SYMMETRIC KEY NuevaClaveDeCifrado DECRYPTION BY PASSWORD ='dsjdkflJ435907NnmM#sX003'; 
    END TRY 
    BEGIN CATCH 
      -- Handle non-existant key here 
    END CATCH 
END 
GO 

CREATE FUNCTION Encrypt(@ValueToEncrypt varchar(max)) 
RETURNS varbinary(256) 
AS 
BEGIN  
-- Declare the return variable here  
DECLARE @Result varbinary(256) 
SET @Result = EncryptByKey(Key_GUID('NuevaClaveDeCifrado'), @ValueToEncrypt)  
-- Return the result of the function  
RETURN @Result 
END 
GO 

CREATE FUNCTION Decrypt(@ValueToDecrypt varbinary(256)) 
RETURNS varchar(max) 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @Result varchar(max) 
    SET @Result = DecryptByKey(@ValueToDecrypt) 
    -- Return the result of the function 
    RETURN @Result 
END 

加密的二进制结果“ Perico“ T-SQL: 0x009C6828879054489426381EFD2E3FD501000000266B3AF2ED7029C1F567AF8119C5D458FCDE1E984B2262A0

C#:

0x9FC66B77905837F5

谢谢!

+0

什么是“rc2”?什么是RC2? – 2012-03-13 12:01:34

+0

你能分享两个C#和SQL – 2012-03-13 12:03:31

+0

你打算共享为我们其余的人在这里的一个问题的代码? – Steve 2012-03-13 12:04:37

回答

1

我觉得为什么SQL和RC2CryptoServiceProvider输出不同的原因是因为你指定你在SQL创建密钥的密码。这就是为什么你的2个结果之间存在长期差异。我建议你使用CLR DLL和你的C#代码来做你想做的事情。

这里是一个例子。我用你的代码来创建函数

using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using Microsoft.SqlServer.Server; 
using System.IO; 
using System.Text; 
using System.Security.Cryptography; 

public partial class UserDefinedFunctions 
{ 
    [Microsoft.SqlServer.Server.SqlFunction] 
    public static SqlBinary Cifrar(string dato, string clave, string vectorInicial) 
    { 
     byte[] plainText = Encoding.ASCII.GetBytes(dato); 
     byte[] keys = Encoding.ASCII.GetBytes(clave); 
     byte[] vecI = Encoding.ASCII.GetBytes(vectorInicial); 
     MemoryStream memdata = new MemoryStream(); 


     RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider(); 
     ICryptoTransform transform; 
     rc2.Mode = CipherMode.CBC; 
     transform = rc2.CreateEncryptor(keys, vecI); 

     CryptoStream encStream = new CryptoStream(memdata, transform, CryptoStreamMode.Write); 


     encStream.Write(plainText, 0, plainText.Length); 
     encStream.Close(); 
     return new SqlBinary(memdata.ToArray()); 
    } 

    [Microsoft.SqlServer.Server.SqlFunction] 
    public static SqlString Descrifrar(byte[] dato, string clave, string vectorInicial) 
    { 
     byte[] keys = Encoding.ASCII.GetBytes(clave); 
     byte[] vecI = Encoding.ASCII.GetBytes(vectorInicial); 
     MemoryStream memdata = new MemoryStream(); 

     RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider(); 
     ICryptoTransform transform; 
     rc2.Mode = CipherMode.CBC; 
     transform = rc2.CreateDecryptor(keys, vecI); 

     CryptoStream encStream = new CryptoStream(memdata, transform, CryptoStreamMode.Write); 


     encStream.Write(dato, 0, dato.Length); 
     encStream.Close(); 

     return new SqlString(Encoding.ASCII.GetString(memdata.ToArray())); 
    } 
}; 

您需要创建一个SQL CLR数据库项目。它会将您连接到数据库。按照步骤操作,并确保您阅读警告。现在不要去停止生产服务器。 添加一个新项目,然后选择用户定义的函数。将代码粘贴在那里。编译它,以确保一切都很好,然后右键单击该项目,并选择部署。你可以测试它,看看它是如何工作的,以及它是否在做你想要的。

我已经在我的机器上测试过了,它似乎完成了这项工作。

+0

感谢您的回答的SQL Server和SQL Server! – JoseMancebo 2012-03-19 11:33:35