RC2 Crypt SQL Server和C#
他正在研究如何在我的应用程序中实现加密算法。他曾看过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
谢谢!
我觉得为什么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数据库项目。它会将您连接到数据库。按照步骤操作,并确保您阅读警告。现在不要去停止生产服务器。 添加一个新项目,然后选择用户定义的函数。将代码粘贴在那里。编译它,以确保一切都很好,然后右键单击该项目,并选择部署。你可以测试它,看看它是如何工作的,以及它是否在做你想要的。
我已经在我的机器上测试过了,它似乎完成了这项工作。
感谢您的回答的SQL Server和SQL Server! – JoseMancebo 2012-03-19 11:33:35
什么是“rc2”?什么是RC2? – 2012-03-13 12:01:34
你能分享两个C#和SQL – 2012-03-13 12:03:31
你打算共享为我们其余的人在这里的一个问题的代码? – Steve 2012-03-13 12:04:37