2010-05-11 1 views
2

OpenSSL을 암호화에 사용하는 코드를 얻는 방법, C#으로 작성한 다른 프로그램에서 사용할 수있는 Microsoft 암호화 공급자를 사용하는 방법을 빠르게 배우려고합니다. .그물.RSA_sign 및 RSACryptoProvider.VerifySignature

더 중요한 것은 OpenSSL 코드에서 생성 된 RSA 메시지 서명을 C# 프로그램에서 확인하려고합니다.

  • 이 메시지를 수신하고 RSACryptoServiceProvider 객체로

    • 수입 상대방의 공개 키 : C#에서

      // Code in C, using the OpenSSL RSA implementation 
      
      char msgToSign[] = "Hello World";  // the message to be signed 
      char signature[RSA_size(rsa)];  // buffer that will hold signature 
      int slen = 0;       // will contain signature size 
      
      // rsa is an OpenSSL RSA context, that's loaded with the public/private key pair 
      
      memset(signature, 0, sizeof(signature)); 
      
      RSA_sign(NID_sha1 
           , (unsigned char*)msgToSign 
           , strlen(msgToSign) 
           , signature 
           , &slen 
           , rsa); 
      
      // now signature contains the message signature 
      // and can be verified using the RSA_verify counterpart 
      // .. I would like to verify the signature in C# 
      

      , 나는 다음을 수행합니다 : 서명을 생성하는 코드는 다음과 같이 보입니다 이 서명

    • 의는 서명을 제가했습니다

    을 확인하려고 처음 두 파트가 작동합니다 (C# 코드에서 C의 OpenSSL 코드로 RSA 암호화 텍스트를 보내고 성공적으로 암호 해독 할 수 있으므로 공개 키가 제대로로드되고 있음을 확인했습니다)

    C#에서 서명 확인, 나는 RSACryptoServiceProvider의 VerifySignature 메소드를 사용해 보았지만 작동하지 않았다. 인터넷에서 파고 들자면 .NET이 OpenSSL보다 서명 생성에 다른 방법을 사용한다는 일부 모호한 정보 만 찾을 수있었습니다. 그래서, 이것을 어떻게 성취 할 수 있는지 아는 사람이 있습니까? 요청이 있었다 때문에

    편집

    , 여기 당신이 당신의 C# 코드를 보였다 경우 도움이 될

    byte[] receivedSignature; 
    // .... 
    // receivedSignature is set to the byte array generated by the OpenSSL side 
    // I've verified this much is working correctly 
    
    // I use my utility to parse a PEM file and extract the other side's public key 
    // also, verified to be working correctly - the public key is good. 
    RSACryptoServiceProvider rsa = MyPEMLoader.LoadFromFile("publicKey.pem"); 
    
    string msgToVerify = "Hello World"; 
    byte[] msgBytes = Encoding.ASCII.GetBytes(msg); // other side uses ASCII, so do the same 
    bool verified = rsa.VerifyHash(msgBytes, "SHA1", receivedSignature); 
    
    // verfied is false.. verfification failed! 
    
  • +0

    이 문제에 대한 해결책은 무엇입니까? 나는 똑같은 일을하려하고있다. – theringostarrs

    답변

    1

    .. 사물의 C#을 측면입니다. 난 그냥 UTF-8 부분을 추측하고있어

    string msg = ...; 
        byte[] localData = Encoding.UTF8.GetBytes(msg); 
        bool ok = rsa.VerifyHash(localData, "SHA1", receivedhash); 
    

    물론 : 나는 무엇인가가 있어야한다고 생각합니다. ASCII 일 수도 있습니다.

    편집 : 여기가 MSDN page입니다. 이 예제에서는 localData가 먼저 해시 된 것과 다른 것으로 보입니다.

    hashedData = hash.ComputeHash(signedData); 
    return rsaCSP.VerifyHash(hashedData, CryptoConfig.MapNameToOID("SHA1"), signature); 
    
    +0

    Thanks @Henk, 제 편집을 참조하십시오. 이것은 내가하고있는 일들과 거의 비슷하지만 분명히 이렇게 작동하지 않습니다. OpenSSL로 생성 된 RSA 서명으로이 코드를 성공적으로 테스트 했습니까? –

    +0

    아니요, OpenSSL을 사용하지 않았습니다. MSDN 링크를 최상으로 확인하고 관련 코드를 복사했습니다. –

    0

    당신이 필요하지 않은 당신의 PEM 유틸리티를 제거하고 이것이 당신이 PEM 파일 리더 코드를 게시 할 수 있습니다 도움이되지 않는 경우

    var cert = new X509Certificate2(HttpContext.Current.Request.MapPath("~/App_Data/PublicKey.pem"), ""); 
    var rsaCryptoIPT = (RSACryptoServiceProvider)cert.PublicKey.Key; 
    var sha1 = new SHA1CryptoServiceProvider(); 
    if (!rsaCryptoIPT.VerifyData(data, sha1, signature)) 
           throw new InvalidOperationException("Invalid signature from bank "); 
    

    를 사용해야합니다.