2016-07-11 3 views
1

.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); 
     } 

단위 테스트를 실행할 때 확인이 실패합니다. 내 코드에 어떤 문제가 있습니까? 어떻게 성공적으로 변환 할 수 있습니까? 나는 또 다른 질문을하고 싶다. 해시 된 메시지로 원래의 문자열로 다시 변환 할 수 있습니까?

답변

2

베이스 64를 사용하십시오. 서명은 임의의 바이트로 구성됩니다. 그러나 모든 임의의 바이트가 디코딩 될 때 유효한 문자를 나타내는 것은 아닙니다.

기본적으로 이전에 으로 인코딩 된 문자열 만 디코딩해야합니다..

+0

정말 고마워요! 그것은 효과가 있었다. –

+0

해시 된 메시지를 원래 코드로 다시 변환 할 수 있습니까? –

+0

죄송합니다. 당신이하려는 것을 이해하지 못합니다. 가능한 한 정확하게하십시오. –