.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);
}
단위 테스트를 실행할 때 확인이 실패합니다. 내 코드에 어떤 문제가 있습니까? 어떻게 성공적으로 변환 할 수 있습니까? 나는 또 다른 질문을하고 싶다. 해시 된 메시지로 원래의 문자열로 다시 변환 할 수 있습니까?
정말 고마워요! 그것은 효과가 있었다. –
해시 된 메시지를 원래 코드로 다시 변환 할 수 있습니까? –
죄송합니다. 당신이하려는 것을 이해하지 못합니다. 가능한 한 정확하게하십시오. –