2014-01-14 2 views
4

디지털 서명을 확인하는 데 사용해야하는 RSA base64 인코딩 공개 키가 있습니다. 공용 키로 RSA를 초기화하는 방법을 이해할 수 없습니다.openssl RSA 공개 키 초기화

unsigned char *signature = ""; //signature string 
char *original = ""; // my original string 
unsigned char sha2HashDigest[SHA256_DIGEST_LENGTH]; 
SHA256(original, strlen(original), sha2HashDigest); 

char *key = "base64encodedKey"; 

RSA *r = RSA_new(); 
//SET RSA public key?! how? 

int result = RSA_verify(NID_sha256, sha2HashDigest, SHA256_DIGEST_LENGTH, 
      signature, strlen(signatrue), r); 
if (result != 1) // handle error 

참고 :

내 코드가 같이 보입니다 나는 아이폰 OS 응용 프로그램에서이 일을하고 있지만, 나는이 질문에 대한 무관하다 생각합니다.

업데이트 : vond에서 제안한대로 EVP 사용이 끝났습니다. 공개 키는 PEM 형식의 파일입니다. 이건 내 코드입니다 :

FILE *fp = fopen([keyFilePath UTF8String], "r"); 
    if (!fp) return NO; 


    EVP_PKEY *pubKey = PEM_read_PUBKEY(fp,NULL,NULL,NULL); 
    EVP_MD_CTX  md_ctx; 
    EVP_MD_CTX_init(&md_ctx); 

    EVP_VerifyInit(&md_ctx, EVP_sha256()); 
    EVP_VerifyUpdate (&md_ctx, (unsigned char*)[msgData bytes], [msgData length]); 
    int err = EVP_VerifyFinal (&md_ctx, (unsigned char*) sigData, (unsigned int)[sigData length], pubKey); 
    EVP_PKEY_free (pubKey); 
+0

키가 PEM 형식입니까? 그렇다면 적절한 메모리 BIO와 함께 [pem (3)] (http://www.openssl.org/docs/crypto/pem.html#)가 원하는 것일 수 있습니다. – WhozCraig

+0

그것은 단지 base64 문자열입니다. 나는 그것에서 파일을 만들 수 있지만 그 불필요한 합병증 아닌가요? – Maggie

답변

9

당신은 시도 할 수있는 다음 :

const char *pub_key_pem = ...; 

BIO *bio = BIO_new_mem_buf((void*)pub_key_pem, strlen(pub_key_pem)); 
RSA *rsa_pub = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL); 

참고 : PEM_read_bio_RSAPublicKey()이 먼저 "BEGIN/END RSA 공개 키"대시 라인 PKCS # 1 PEM 형식 (예상/마지막 줄); PEM에 "BEGIN/END PUBLIC KEY"가 있으면 PEM_read_bio_RSA_PUBKEY()을 대신 시도해야합니다. 차이점 herehere에 대한 설명을 참조하십시오. 당신이 당신의 base64로 문자열이 대시 라인의이없는 경우

, 당신은 쉽게 다음, 바이너리 버퍼로 base64로 문자열을 디코딩에서 RSA* 공개 키를 얻기 위해 d2i_RSAPublicKey() 또는 d2i_RSA_PUBKEY() 중 하나를 사용하여 찾을 수 있습니다 그것.

+0

가능하면 개인적으로 지금 사용하려는 수준 인터페이스에 대한 고급 EVP 인터페이스를 선호합니다. https://www.openssl.org/docs/crypto/EVP_SignInit.html – vond

+0

어떻게하면 EVP를 사용할 수 있습니까? 내가 볼 수있는 한 서명 확인 방법이 없습니다. – Maggie

+0

EVP를 사용하려면 EVP_VerifyInit, EVP_VerifyUpdate 및 EVP_VerifyFinal이 필요합니다. API는 http://www.openssl.org/docs/crypto/EVP_VerifyInit.html – vond