C# C语言中的数字签名#
所以我有一个服务器和一个客户端。 我在安全方面有一个任务/问题。 服务器和客户端之间的对话: 客户:给我配置文件,服务器! 服务器:发送带有数字签名的配置文件 客户端:接收数据 那么,我应该选择什么方法呢C# C语言中的数字签名#,c#,cryptography,digital-signature,C#,Cryptography,Digital Signature,所以我有一个服务器和一个客户端。 我在安全方面有一个任务/问题。 服务器和客户端之间的对话: 客户:给我配置文件,服务器! 服务器:发送带有数字签名的配置文件 客户端:接收数据 那么,我应该选择什么方法呢 生成私钥和公钥(服务器端) 将私钥保存在xml文件(TIP1)中 客户端将使用公钥(与私钥一起生成)进行传播 之后,客户端将向服务器发送请求时: 1.服务器从xml文件(TIP1)获取私钥并发送配置文件+数字签名(通过私钥加密) 2.客户端接收来自服务器的响应,并通过公钥验证数字签名 我如何在
public class Cryptography
{
private const string CONTAINER_NAME = "MyContainer";
private static RSACryptoServiceProvider rsa;
private static MD5 md5;
private static void AssignParameter()
{
CspParameters cspParams;
cspParams = new CspParameters();
cspParams.KeyContainerName = CONTAINER_NAME;
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
rsa = new RSACryptoServiceProvider(cspParams);
}
static Cryptography()
{
md5 = MD5.Create();
}
public static byte[] CreateSignature(byte[] data, string pathToKey)
{
AssignParameter();
StreamReader reader = new StreamReader(pathToKey);
string privateKeyXML = reader.ReadToEnd();
rsa.FromXmlString(privateKeyXML);
reader.Close();
RSAPKCS1SignatureFormatter RSAform = new RSAPKCS1SignatureFormatter(rsa);
RSAform.SetHashAlgorithm("MD5");
byte[] hashData = md5.ComputeHash(data);
return RSAform.CreateSignature(hashData);
}
public static bool VerifySignature(byte[] originalData, byte[] data, string pathToKey)
{
StreamReader reader = new StreamReader(pathToKey);
string publicKeyXML = reader.ReadToEnd();
rsa.FromXmlString(publicKeyXML);
reader.Close();
RSAPKCS1SignatureDeformatter RSAdeform = new RSAPKCS1SignatureDeformatter(rsa);
RSAdeform.SetHashAlgorithm("MD5");
byte[] hashOriginalData = md5.ComputeHash(originalData);
return RSAdeform.VerifySignature(hashOriginalData, data);
}
public static void AssignNewKey()
{
AssignParameter();
StreamWriter writer = new StreamWriter(@"D:\cryptography\privatekey.xml");
string privatePrivateKeyXML = rsa.ToXmlString(true);
writer.Write(privatePrivateKeyXML);
writer.Close();
writer = new StreamWriter(@"D:\cryptography\publickey.xml");
string publicOnlyKeyXML = rsa.ToXmlString(false);
writer.Write(publicOnlyKeyXML);
writer.Close();
}
}
你觉得怎么样?与其重新发明轮子,你可以简单地使用WCF的传输或消息安全性,然后使用它-当然,除非你出于任何原因不能使用WCF。我有理由需要使用密钥并处理它。然后你应该在问题中概述这些原因。在软件需求中,我只能使用.NET2