C# 使用同一容器进行加密时的不同值
我在同一个解决方案中有两个项目,在一个项目中,我使用C# 使用同一容器进行加密时的不同值,c#,encryption,key,rsa,rsacryptoserviceprovider,C#,Encryption,Key,Rsa,Rsacryptoserviceprovider,我在同一个解决方案中有两个项目,在一个项目中,我使用SignData加密一条消息,在另一个项目中,我正在重新创建在第一个项目中加密的消息,并比较结果以查看它们是否相同。但是来自第一个项目的加密不会返回与来自第二个项目的加密相同的值。如果我在两个项目中都给出相同的字节数组,那么如何使返回的值相同。我认为RSA会生成两个不同的密钥,但我使用相同的容器 param.KeyContainerName = "SignatureContainer101"; 有没有办法不用交钥匙就可以做到这一点?我需要它在
SignData
加密一条消息,在另一个项目中,我正在重新创建在第一个项目中加密的消息,并比较结果以查看它们是否相同。但是来自第一个项目的加密不会返回与来自第二个项目的加密相同的值。如果我在两个项目中都给出相同的字节数组,那么如何使返回的值相同。我认为RSA
会生成两个不同的密钥,但我使用相同的容器
param.KeyContainerName = "SignatureContainer101";
有没有办法不用交钥匙就可以做到这一点?我需要它在同一台机器上本地运行。或者我能做些什么来获得同样的结果?
这是我正在使用的代码:
public static byte[] SignData(byte[] message)
{
//convert data to be signed in a byte array
byte[] byteSignature2;
CspParameters param = new CspParameters();
//Giving container a name, so we can use the same keys for verifying data.
param.KeyContainerName = "SignatureContainer101";
//Initializing RSACryptoServiceProvider
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
{
//We want RSACryptoServiceProvider to save keys in keystore
//because we want to keep signature generation routine seperate
//from verifying data against signature.
rsa.PersistKeyInCsp = true;
byte[] byteSignature = rsa.SignData(message, "SHA256");
byteSignature2 = new byte[byteSignature.Length];
byteSignature2 = byteSignature;
}
return byteSignature2;
}
public static bool VerifyData(byte[] originalMessage, byte[] signedMessage)
{
bool isSuccess = false;
CspParameters param = new CspParameters();
//Utilizing the same key container which was created during
//signature generation process i.e. in GetDataSignature(string data) function.
//If we don't utilize the same keycontainer, VerifyData will always return false
//because RSACryptoSeriveProvider initialization will generate new keys.
param.KeyContainerName = "SignatureContainer101";
//Initializing RSACryptoServiceProvider
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
{
//verifying data against signature
isSuccess = rsa.VerifyData(originalMessage, "SHA256", signedMessage);
}
return isSuccess;
}
}
我发现你的代码没有问题。它起作用了!这就是我所做的:
public partial class Program
{
protected override void Execute()
{
var message1 = Encoding.UTF8.GetBytes("Hello there,");
var message2 = Encoding.UTF8.GetBytes("Hello there");
var signed = SignData(message1);
var notOK = VerifyData(message2, signed);
var oK = VerifyData(message1, signed);
}
public static byte[] SignData(byte[] message)
{
byte[] byteSignature2;
var param = new CspParameters
{
KeyContainerName = "SignatureContainer101"
};
using (var rsa = new RSACryptoServiceProvider(param))
{
rsa.PersistKeyInCsp = true;
var byteSignature = rsa.SignData(message, "SHA256");
byteSignature2 = byteSignature;
}
return byteSignature2;
}
public static bool VerifyData(byte[] originalMessage, byte[] signedMessage)
{
bool isSuccess;
var param = new CspParameters
{
KeyContainerName = "SignatureContainer101"
};
using (var rsa = new RSACryptoServiceProvider(param))
isSuccess = rsa.VerifyData(originalMessage, "SHA256", signedMessage);
return isSuccess;
}
}
我不确定到底是什么问题 如果我在两个项目中都给出相同的字节数组,那么如何使返回的值相同 当使用相同的密钥对相同的消息调用两次时,是否希望
SignData
返回完全相同的字节?它不会,也不应该。每次执行“相同”的非对称(公钥)加密/签名时,结果都应该不同。这是通过使用过程中使用的随机填充块实现的。这是必要的,因为在公钥密码中,其中一个密钥是公开的,如果不使用随机性,则会使密码特性变弱。(有关更多信息,请参见例如…)
因此,您不应该逐字节比较结果,您应该使用
VerifyData
方法检查签名是否正确,而不是是否相同。这就是我试图做的,我从第一个项目获得签名,并将其与用于签名的重新创建的消息进行比较,但验证失败…您是否在与用于签署邮件的用户帐户相同的用户帐户(在同一台计算机上)下运行验证?当我在同一项目中验证数据时,验证有效,但当我在另一个项目中验证数据时,验证无效,它返回false