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

暗号化のバイナリ結果」ペリコ " T-SQL: 0x009C6828879054489426381EFD2E3FD501000000266B3AF2ED7029C1F567AF8119C5D458FCDE1E984B2262A0

C#:

0x9FC66B77905837F5

ありがとう!

+0

「rc2」とは何ですか?何のRC2? –

+0

C#とSQLの両方のコードを共有できます –

+0

ここで残りの質問を共有する予定ですか? – Steve

答えて

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データベースプロジェクトを作成する必要があります。これはあなたをデータベースに接続します。手順に従って、警告を必ずお読みください。今は運用サーバーを停止しないでください。 新しい項目を追加し、ユーザー定義関数を選択します。そこにコードを貼り付けます。それをコンパイルして、すべてが問題ないことを確認してから、プロジェクトを右クリックし、「Deploy」を選択します。あなたはそれをテストして、それがどのように動作するか、そしてあなたが望むことをしているのかを見ることができます。

私は自分のマシンでテストしましたが、それは仕事をしているようです。

+0

からお返事ありがとうございます! – JoseMancebo