gpt4 book ai didi

c# - 使用 RSA C# 签名和验证签名

转载 作者:IT王子 更新时间:2023-10-29 03:52:43 25 4
gpt4 key购买 nike

我最近发布了有关使用 RSA 加密大数据的问题,我终于解决了这个问题,现在我将继续使用用户的私钥实现签名并使用相应的公钥进行验证。但是,每当我比较签名数据和原始消息时,我基本上只会返回 false。我希望你们中的一些人能看出我做错了什么。

代码如下:

public static string SignData(string message, RSAParameters privateKey)
{
//// The array to store the signed message in bytes
byte[] signedBytes;
using (var rsa = new RSACryptoServiceProvider())
{
//// Write the message to a byte array using UTF8 as the encoding.
var encoder = new UTF8Encoding();
byte[] originalData = encoder.GetBytes(message);

try
{
//// Import the private key used for signing the message
rsa.ImportParameters(privateKey);

//// Sign the data, using SHA512 as the hashing algorithm
signedBytes = rsa.SignData(originalData, CryptoConfig.MapNameToOID("SHA512"));
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
return null;
}
finally
{
//// Set the keycontainer to be cleared when rsa is garbage collected.
rsa.PersistKeyInCsp = false;
}
}
//// Convert the a base64 string before returning
return Convert.ToBase64String(signedBytes);
}

所以这是第一步,签署数据,接下来我继续验证数据:

public static bool VerifyData(string originalMessage, string signedMessage, RSAParameters publicKey)
{
bool success = false;
using (var rsa = new RSACryptoServiceProvider())
{
byte[] bytesToVerify = Convert.FromBase64String(originalMessage);
byte[] signedBytes = Convert.FromBase64String(signedMessage);
try
{
rsa.ImportParameters(publicKey);

SHA512Managed Hash = new SHA512Managed();

byte[] hashedData = Hash.ComputeHash(signedBytes);

success = rsa.VerifyData(bytesToVerify, CryptoConfig.MapNameToOID("SHA512"), signedBytes);
}
catch (CryptographicException e)
{
Console.WriteLine(e.Message);
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
return success;
}

这是测试客户端:

public static void Main(string[] args)
{
PublicKeyInfrastructure pki = new PublicKeyInfrastructure();
Cryptograph crypto = new Cryptograph();
RSAParameters privateKey = crypto.GenerateKeys("email@email.com");

const string PlainText = "This is really sent by me, really!";

RSAParameters publicKey = crypto.GetPublicKey("email@email.com");

string encryptedText = Cryptograph.Encrypt(PlainText, publicKey);

Console.WriteLine("This is the encrypted Text:" + "\n " + encryptedText);

string decryptedText = Cryptograph.Decrypt(encryptedText, privateKey);

Console.WriteLine("This is the decrypted text: " + decryptedText);

string messageToSign = encryptedText;

string signedMessage = Cryptograph.SignData(messageToSign, privateKey);

//// Is this message really, really, REALLY sent by me?
bool success = Cryptograph.VerifyData(messageToSign, signedMessage, publicKey);

Console.WriteLine("Is this message really, really, REALLY sent by me? " + success);

}

我是不是漏掉了一步?根据 Cryptography API 和那里的示例,我不应该手动计算任何哈希值,因为我在方法调用本身中提供了算法。

任何帮助将不胜感激。

最佳答案

您的问题出在 VerifyData 方法的开头:

public static bool VerifyData(string originalMessage, string signedMessage, RSAParameters publicKey)
{
bool success = false;
using (var rsa = new RSACryptoServiceProvider())
{
//Don't do this, do the same as you did in SignData:
//byte[] bytesToVerify = Convert.FromBase64String(originalMessage);
var encoder = new UTF8Encoding();
byte[] bytesToVerify = encoder.GetBytes(originalMessage);

byte[] signedBytes = Convert.FromBase64String(signedMessage);
try
...

出于某种原因,您切换到 FromBase64String 而不是 UTF8Encoding.GetBytes

关于c# - 使用 RSA C# 签名和验证签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8437288/

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