2012-03-13 48 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