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