2013-03-22 2 views
0

У меня есть массив байтов ASN.1 x509, содержащий по модулю и открытый ключ пары RSA. Моя цель - сделать все возможное, чтобы использовать это для шифрования строки. Я пытаюсь использовать openssl в объективе-c, чтобы выполнить это. Всякий раз, когда я пытаюсь получить объект RSA с использованием d2i_X509, он возвращает null. Я готов переключиться на другую библиотеку, если я не смогу выполнить это с помощью openssl. Пожалуйста, помогите мне найти что-то, что работает.Как шифровать строку с открытым ключом RSA из массива Byte x509 ASN.1?

+1

Вы * уверены * Вы хотите шифровать/дешифровать с парой ключей RSA, а не использовать симметричный ключ сеанса вместо (который является фактическим вещь зашифрованы вашей пары ключей RSA;. Не лежащие в основе данных То, что ключ сеанса для)? Просто любопытно. – WhozCraig

+0

Я уверен. Мне обеспечено это и нужно использовать его – blake305

ответ

1

Обычно вы не шифруете строку, используя открытый ключ X.509. Вместо этого вы создадите сильный случайный ключ (определенного качества); используйте обычное симметричное шифрование (например, AES), а затем encyrpt строку с этим. Затем вы шифруете случайный ключ с помощью X.509.

Проконсультируйтесь с хорошей книгой PKI/Crypto (например, http://www.amazon.com/Applied-Cryptography-Protocols-Algorithms-Source/dp/0471117099) о том, почему (разделы по ключевым утечкам, сбрасывание битов, заполнение и (повторное) шифрование дважды).

Если вы действительно настаиваете на этом, посмотрите на функцию https://github.com/dirkx/smime-add-encryption-for-recipient/blob/master/smime-add-encrypt/main.c на функцию pkcs7_encode_rinfo.

x509cert = ... something to read your x509 byte array in. 

unsigned char *stuff = "Some zecret string"; 
int stufflen = strlen(stuff); 

EVP_PKEY *pkey; 
EVP_PKEY_CTX *pctx = NULL; 

assert(pkey = = X509_get_pubkey(x509cert)); 
assert(pctx = EVP_PKEY_CTX_new(pkey, NULL)); 
assert(EVP_PKEY_encrypt_init(pctx)==1); 
assert((EVP_PKEY_CTX_ctrl(pctx, -1, EVP_PKEY_OP_ENCRYPT 
         EVP_PKEY_CTRL_PKCS7_ENCRYPT, 0, ri)==1); 

size_t eklen; 
assert(EVP_PKEY_encrypt(pctx, NULL, &eklen, stuff, stufflen)==1); 

ek = OPENSSL_malloc(eklen); 
assert(ek); 

unsigned char *ek = NULL; 
assert((EVP_PKEY_encrypt(pctx, ek, &eklen, key, keylen)==1); 

printf("Encrypted blurp: "); 
for(int i = 0; i < eklen; i++) { 
    printf("0x%02X ", ek[i]; 
}; 
printf("\n"); 
exit(0); 
Смежные вопросы