2014-01-14 10 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 

Примечание: Я делаю это в приложении IOS, но я думаю, что это не имеет никакого отношения к этому вопросу.

ОБНОВЛЕНИЕ: В итоге я использовал EVP, как было предложено vond. Открытый ключ - это файл в формате 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? если это так, [pem (3)] (http://www.openssl.org/docs/crypto/pem.html#) в сочетании с надлежащей памятью BIO, вероятно, вы хотите. – WhozCraig

+0

это просто base64 строка. Я могу сделать из него файл pem, но разве это не лишнее осложнение? – 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() ожидает PKCS # 1 формат PEM (с "BEGIN/END RSA PUBLIC KEY" пунктирными линиями в первом/последние строки); если у вас есть PEM с «BEGIN/END PUBLIC KEY», вы должны попробовать вместо этого PEM_read_bio_RSA_PUBKEY(). См. Пояснение разницы here и here.

Если у вас нет каких-либо из этих пунктирных линий в ваших base64 строку, вы можете найти его легче декодировать строку base64 в двоичный буфер, а затем использовать один из d2i_RSAPublicKey() или d2i_RSA_PUBKEY(), чтобы получить открытый ключ от RSA* Это.

+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

Смежные вопросы