Я разрабатываю .NET-проект. Я делаю шифрование для некоторых конфиденциальных данных. Я использую алгоритм RSA для этого. Я могу успешно проверить хеш-сообщение, используя закрытый ключ, открытый ключ и подпись.Преобразование байтового массива сигнатуры алгоритма RSA в строку и обратно в байтовый массив снова в .NET C#
Но у меня возникла проблема с преобразованием сигнатуры массива байтов, сгенерированной алгоритмом RSA, в строку и преобразование этой строки обратно в байтовый массив для проверки. Но проверка завершается с ошибкой, если я проверяю подпись с байтовым массивом, который преобразуется обратно из строки подписи. Мой сценарий ниже.
Это мой полный класс Криптография с RSA алгоритм
public class Cryptograph:ICryptograph
{
private string RsaHashAlgorithm { get; set; }
public Cryptograph()
{
this.RsaHashAlgorithm = "SHA256";
}
public RSAParameters[] GenarateRSAKeyPairs()
{
using (var rsa = new RSACryptoServiceProvider(2048))
{
rsa.PersistKeyInCsp = false;
RSAParameters publicKey = rsa.ExportParameters(false);
RSAParameters privateKey = rsa.ExportParameters(true);
return new RSAParameters[]{ privateKey , publicKey };
}
}
public byte[] SignRsaHashData(RSAParameters privateKey,byte[]hashOfDataToSign)
{
using (var rsa = new RSACryptoServiceProvider(2048))
{
rsa.PersistKeyInCsp = false;
rsa.ImportParameters(privateKey);
var rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
rsaFormatter.SetHashAlgorithm(RsaHashAlgorithm);
return rsaFormatter.CreateSignature(hashOfDataToSign);
}
}
public bool VerifyRsaSignature(RSAParameters publicKey,byte[]hashOfDataToSign, byte[] signature)
{
using (var rsa = new RSACryptoServiceProvider(2048))
{
rsa.ImportParameters(publicKey);
var rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
rsaDeformatter.SetHashAlgorithm(RsaHashAlgorithm);
return rsaDeformatter.VerifySignature(hashOfDataToSign, signature);
}
}
}
я тест проверки. Ниже приведен рабочий код и с его помощью успешно завершен.
[TestMethod]
public void VerifyRsaEncryptionSign()
{
var document = Encoding.UTF8.GetBytes("test message");
byte[] hashedDocument;
using (var sha256 = SHA256.Create())
{
hashedDocument = sha256.ComputeHash(document);
}
Cryptograph crypto = new Cryptograph();
RSAParameters[] keys = crypto.GenarateRSAKeyPairs();
RSAParameters privateKey = keys[0];
RSAParameters publicKey = keys[1];
byte[] signature = crypto.SignRsaHashData(privateKey, hashedDocument);
bool verified = crypto.VerifyRsaSignature(publicKey, hashedDocument, signature);
Assert.IsTrue(verified);
}
Выше кода, модульный тест прошел и успешно прошел проверку.
Но я хочу, чтобы преобразовать массив байтов подписи и преобразовать эту строку в массив байтов для проверки, как показано ниже.
[TestMethod]
public void VerifyRsaEncryptionSign()
{
var document = Encoding.UTF8.GetBytes("test message");
byte[] hashedDocument;
using (var sha256 = SHA256.Create())
{
hashedDocument = sha256.ComputeHash(document);
}
Cryptograph crypto = new Cryptograph();
RSAParameters[] keys = crypto.GenarateRSAKeyPairs();
RSAParameters privateKey = keys[0];
RSAParameters publicKey = keys[1];
byte[] signature = crypto.SignRsaHashData(privateKey, hashedDocument);
string stringSignature = Encoding.UTF8.GetString(signature);// Converted byte array to string
signature = Encoding.UTF8.GetBytes(stringSignature);//convert string back to byte array
bool verified = crypto.VerifyRsaSignature(publicKey, hashedDocument, signature);
Assert.IsTrue(verified);
}
Когда я запускаю модульный тест, проверка не выполняется. Что не так с моим кодом? Как я могу успешно преобразовать его? Я также хотел бы задать дополнительный вопрос. Можно ли преобразовать в хэшированное сообщение обратно в исходную строку?
Благодарю вас, многого! Это сработало. –
Возможно ли преобразовать хешированное сообщение обратно в исходную строку с кодом? –
Извините, я не понимаю, что вы пытаетесь сделать. Пожалуйста, будьте как можно точнее. –