Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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# DSA-在Python中对消息进行签名以在C中进行验证#_C#_Python_Python 3.x_Cryptography - Fatal编程技术网

C# DSA-在Python中对消息进行签名以在C中进行验证#

C# DSA-在Python中对消息进行签名以在C中进行验证#,c#,python,python-3.x,cryptography,C#,Python,Python 3.x,Cryptography,你好, 我正在C#上生成一条消息,该消息必须传递给python 3.7中的RPC服务器,该服务器将对其进行签名并将其返回给C#进行验证 我最近刚开始学习密码学和python,无论我签署什么都不能用C#验证,我遵循我能找到的每个文档,我想我使用的是相同的算法 这就是我生成密钥的方式,因为.Net库生成xml密钥,所以我使用BouncyCastle实用程序将私有密钥转换为.pem,以使用python的pycryptodome库: using (DSA dsa = new DSACng(2048))

你好, 我正在C#上生成一条消息,该消息必须传递给python 3.7中的RPC服务器,该服务器将对其进行签名并将其返回给C#进行验证

我最近刚开始学习密码学和python,无论我签署什么都不能用C#验证,我遵循我能找到的每个文档,我想我使用的是相同的算法

这就是我生成密钥的方式,因为.Net库生成xml密钥,所以我使用BouncyCastle实用程序将私有密钥转换为.pem,以使用python的pycryptodome库:

using (DSA dsa = new DSACng(2048))
{
   var privateKey = dsa.ToXmlString(true);
   var publicKey = dsa.ToXmlString(false);
   File.WriteAllText("privateKey.xml", privateKey);
   File.WriteAllText("publicKey.xml", publicKey);

   AsymmetricCipherKeyPair dsaKey = DotNetUtilities.GetDsaKeyPair(dsa);
   using (StreamWriter sw = new StreamWriter("privateKey.pem"))
   {
      PemWriter pw = new PemWriter(sw);
      pw.WriteObject(dsaKey);
   }
} 
然后在python中:

def sign_message(par1, par2, par3):
   message = _generate_message(par1, par2, par3).encode('utf-8')
   h = SHA256.new(message)
   b64Message = base64.b64encode(h.digest())
   f = open("privateKey.pem", "r")
   key = DSA.import_key(f.read())
   signer = DSS.new(key, 'fips-186-3')
   signature = signer.sign(h)
   b64Signature = base64.b64encode(signature)

   return [b64Message, b64Signature]
但如果我用C#验证消息,它只会打印“未验证”:


我的代码有什么问题?非常感谢您的帮助

我看不到您用C#对代码中缺少的消息和签名进行解码。请注意,如果您想确保安全,就不应该在验证端生成私钥。如果验证一开始就不起作用,我认为尝试解码消息没有任何意义。密钥生成部分是一次性的,我生成密钥,并在部署之前删除该部分(我只需要一个密钥,不需要生成更多)。好的,但是您对签名进行base 64编码,而C代码中缺少对该签名的解码,对吗?
using(DSA dsa = new DSACng(2048)
{
   byte[] message = response[0];
   byte[] signature = response[1];
   var publicKey =  File.ReadAllText("publicKey.xml");
   dsa.FromXmlString(publicKey);
   if (dsa.VerifyData(message, signature, HashAlgorithmName.SHA256))
       Console.WriteLine("Verified");
   else
       Console.WriteLine("Not verified");
}