gpt4 book ai didi

c# - 如何使用 rsa 正确验证数据?

转载 作者:太空宇宙 更新时间:2023-11-03 22:55:10 24 4
gpt4 key购买 nike

我想用私钥签署一条消息并用公钥验证它,但我无法让它工作..

这是我对数据签名的方式(已编辑,但仍无法正常工作):

public static string SignData(string message, string privateKey) {

byte[] plainText = ASCIIEncoding.Unicode.GetBytes(message);

var rsaWrite = new RSACryptoServiceProvider();
rsaWrite.FromXmlString(privateKey);

byte[] signature = rsaWrite.SignData(plainText, new SHA1CryptoServiceProvider());

return Convert.ToBase64String(signature);
}

以下是我测试数据的方式(已编辑,仍然无法正常工作):

public static bool VerifyData(string sign, string publicKey, string orig) {

byte[] signature = Convert.FromBase64String(sign);
byte[] original = ASCIIEncoding.Unicode.GetBytes(orig);

var rsaRead = new RSACryptoServiceProvider();
rsaRead.FromXmlString(publicKey);

if (rsaRead.VerifyData(original, new SHA1CryptoServiceProvider(), signature)) {
return true;
} else {
return false;
}
}

我将 key 对作为 xml 字符串存储在我的帐户类中。该函数在account.cs的构造函数中执行:

public void addKeys() {

RSACryptoServiceProvider provider = new RSACryptoServiceProvider(1024);

privateKey = provider.ToXmlString(true);
publicKey = provider.ToXmlString(false);
}

我用这个来测试整体:

string signedHash = Utility.SignData("test" ,account.privateKey);

if (Utility.VerifyData(signedHash, account.publicKey, "test")) {
Console.WriteLine("WORKING!");
} else {
Console.WriteLine("SIGNING NOT WORKING");
}

为什么整体不起作用?我的猜测是,由于某些编码问题,它无法正常工作。

最佳答案

return ASCIIEncoding.Unicode.GetString(signature);

签名是任意二进制数据,不一定是合法的 Unicode/UCS-2。您需要使用任意编码 ( https://en.wikipedia.org/wiki/Binary-to-text_encoding#Encoding_standards ) 对所有任意数据进行编码。最流行的签名传输方式是 Base64,因此您需要

return Convert.ToBase64String(signature);

当然,在验证方法中使用 Convert.FromBase64String


如果您使用 .NET 4.6 或更高版本的目标进行编译,您还可以使用更新的签名/验证 API:

rsaRead.VerifyData(original, new SHA1CryptoServiceProvider(), signature)

会是

rsaRead.VerifyData(original, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1)

虽然它可能看起来并不简单,但它阻止了另一种方法所做的 SHA1CryptoServiceProvider 的分配和终结,并且当您可能想要从 Pkcs1 签名填充切换到 PSS 签名填充时,它会为 The Future 设置。 (但真正的优势是该方法位于 RSA 基类而不是 RSACryptoServiceProvider 特定类型上)。

关于c# - 如何使用 rsa 正确验证数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45788230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com