Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不同操作系统(Win7与Win2008R2)上在.NET中生成的加密有效负载签名不同_C#_.net_Encryption_Rsa - Fatal编程技术网

C# 在不同操作系统(Win7与Win2008R2)上在.NET中生成的加密有效负载签名不同

C# 在不同操作系统(Win7与Win2008R2)上在.NET中生成的加密有效负载签名不同,c#,.net,encryption,rsa,C#,.net,Encryption,Rsa,我工作的一位开发人员在使用证书的私钥对生产服务器上的有效负载进行签名时遇到了一些困难。这段代码在他的开发箱和生产服务器上都可以工作,但是这两个不同的位置对于相同的负载最终会有不同的签名。我们已经确认这两个位置的证书相同,但出于某种原因,rsacryptserviceprovider.SignData方法似乎返回不同的值,具体取决于它是在Windows 7上运行还是在Server 2008 R2上运行 这是我们正在使用的代码-您可以看到,我们已经用配置文件中的Base64字符串替换了负载,因此不可

我工作的一位开发人员在使用证书的私钥对生产服务器上的有效负载进行签名时遇到了一些困难。这段代码在他的开发箱和生产服务器上都可以工作,但是这两个不同的位置对于相同的负载最终会有不同的签名。我们已经确认这两个位置的证书相同,但出于某种原因,rsacryptserviceprovider.SignData方法似乎返回不同的值,具体取决于它是在Windows 7上运行还是在Server 2008 R2上运行

这是我们正在使用的代码-您可以看到,我们已经用配置文件中的Base64字符串替换了负载,因此不可能是负载中的差异导致了不同的签名

byte[] encryptedSignature = new byte[1];
CspParameters cp = new CspParameters(24, "Microsoft Enhanced RSA and AES Cryptographic Provider", "{4FC30434-29E5-482D-B817-72102A046137}");
cp.Flags = CspProviderFlags.UseMachineKeyStore;
cp.KeyNumber = (int)KeyNumber.Exchange;

bool signatureVerified = false;

using (RSACryptoServiceProvider rsaCrypto = new RSACryptoServiceProvider(2048, cp))
{
    encryptedSignature = rsaCrypto.SignData(Convert.FromBase64String(Properties.Settings.Default.EncryptedSessionData), "SHA256");
    // Signature verifies properly on both servers
    signatureVerified = rsaCrypto.VerifyData(Convert.FromBase64String(Properties.Settings.Default.EncryptedSessionData), "SHA256", encryptedSignature);

}
服务器(一个x64机箱)处理签名的方式是否可能与我们的x86开发工作站不同?这似乎不太可能,但我们很难理解为什么生产服务器会生成不同的签名。另外,不确定这是否重要,但此代码来自ASP.NET页面,我们在该页面中创建负载,然后将访问者与加密的负载一起转发到供应商页面


希望有人在这里能有所启发,或者看到类似的东西。

改变

CspParameters(24, "Microsoft Enhanced RSA and AES Cryptographic Provider", "{4FC30434-29E5-482D-B817-72102A046137}");

CspParameters cp = new CspParameters(24, "Microsoft Enhanced RSA and AES Cryptographic Provider", ((RSACryptoServiceProvider)cert.PrivateKey).CspKeyContainerInfo.KeyContainerName);
这将从私钥中获取容器名称。
漂亮的头像照片;)

。您不能保证同一纯文本的两个签名是相同的。

尝试根据公钥验证不同的签名。。。只要两个签名都有效,就没有问题

PKCS1 V 1.5签名中不使用随机填充(如PKCS1 RSA文档中所述的EMSA-PKCS1-v1_5)。它仅用于加密(即使用公钥加密)