SecKeyGeneratePair возвращает errSecUnimplemented

Я пытаюсь внедрить алгоритм шифрования RSA в свое приложение iOS, но когда я пытаюсь сгенерировать пару открытого и закрытого ключей, функция возвращает мне ошибку errSecUnimplemented. Я использую SDK 5.1 и на данный момент ориентируюсь на 5.1.

Можно ли не использовать эту функцию, или я что-то не так настроил при попытке сгенерировать пару?

Вот мой код для генерации ключа:

SecKeyRef publicKey, privateKey;
CFDictionaryRef parameters;
const void* keys[] = {kSecAttrKeyType, kSecAttrKeyTypeRSA};
int keySize = 1024;
const void *values[] = {kSecAttrKeySizeInBits, &keySize};

parameters = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 2, NULL, NULL);
OSStatus ret = SecKeyGeneratePair(parameters, &publicKey, &privateKey);
if ( ret == errSecSuccess )
{
    NSLog(@"Key success!");
}
else 
{
    NSLog(@"Key Failure! %li", ret);
}

person Dan F    schedule 04.05.2012    source источник


Ответы (3)


Я пересмотрел его, чтобы просто завершить решение для вас. 1) Вам нужно использовать CFNumberRef, а не указатель на int для числового значения. 2) Значения должны быть значениями, ключи должны быть ключами - вы смешивали ключ и значение в каждом из «ключей» и «значений».

SInt32 iKeySize = 1024;
CFNumberRef keySize = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &iKeySize);
const void* values[] = { kSecAttrKeyTypeRSA, keySize };
const void* keys[] = { kSecAttrKeyType, kSecAttrKeySizeInBits };
CFDictionaryRef parameters = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 2, NULL, NULL);

SecKeyRef publicKey, privateKey;
OSStatus ret = SecKeyGeneratePair(parameters, &publicKey, &privateKey);
if ( ret == errSecSuccess )
    NSLog(@"Key success!");
else 
    NSLog(@"Key Failure! %li", ret);
person NSProgrammer    schedule 11.05.2012
comment
Я получаю следующую ошибку при включенном ARC: Use __bridge_retained to make an ARC object available as a +1 'CFTypeRef' (aka 'const void *') В прошлый раз, когда я пытался использовать __bridge приведение, все пошло наперекосяк, это более простой, но безопасный случай сделать это? - person Dan F; 14.05.2012
comment
И даже если я делаю приведение __bridge_retained, я все равно получаю ошибку -4 - person Dan F; 14.05.2012
comment
Отредактировано для полноты. Вы должны быть в порядке (если я не оставил никаких опечаток). - person NSProgrammer; 15.05.2012
comment
Я получаю предупреждение с вашим кодом, потому что values имеет тип void*, а не void**, и если я превращаю его в const void* values[], я получаю исключение неправильного доступа, и все равно ошибка -4, если я оставлю его просто как const void * - person Dan F; 15.05.2012
comment
Извините, вы должны передать ссылку на свои ключи и значения, отредактированные - person NSProgrammer; 15.05.2012
comment
Это все еще не те типы. CFDictionaryCreate ищет два const void **, а keys сам по себе является const void **, добавляя к нему ссылку, вы делаете его const void ***, и в вашем последнем редактировании values по-прежнему пишется как просто const void *, а не const void *[] - person Dan F; 15.05.2012
comment
О, чувак... Теперь я вижу это. Я не поставил скобки массива для одного из объявлений. Я должен упомянуть, что делаю все это на своем iPhone. - person NSProgrammer; 16.05.2012
comment
Я попробовал эту комбинацию, и именно так я получаю исключение EXC_BAD_ACCESS, выдаваемое на SecKeyGeneratePair - person Dan F; 16.05.2012
comment
Вот что я получаю за то, что не проверяю свою работу компилятором. значениям нужен сам CFNumberRef, а не ссылка на него. Код обновлен... - person NSProgrammer; 16.05.2012
comment
Ах ХА! Наконец-то успех! Спасибо за всю вашу помощь, я довольно долго искал пример кода для этого метода, но нигде ничего не было... - person Dan F; 16.05.2012
comment
Ура! Сила краудсорсинга и настойчивости! :) - person NSProgrammer; 16.05.2012
comment
Для тех, кто использует пример кода здесь, 1024-битные ключи RSA больше не считаются безопасными, вместо этого вы должны использовать 2048- или 4096-битные ключи. - person Michael Barnwell; 30.01.2018
comment
У нас есть это в быстром? - person Mike; 29.05.2020

Разве это не должно быть:

const void* keys[] = {kSecAttrKeyType, kSecAttrKeySizeInBits};
int keySize = 1024;
const void *values[] = {kSecAttrKeyTypeRSA, &keySize};

то есть ключи должны быть ключами dict, а значения - значениями, в настоящее время у вас есть одна пара (ключ, значение) в ключах и одна в значениях.

person Arno Bakker    schedule 15.05.2012
comment
Я получаю исключение плохого доступа, когда делаю это таким образом, даже с установкой размера ключа, как указано выше. - person Dan F; 15.05.2012
comment
Возможно, iphonedevsdk.com/forum/iphone-sdk-development / помогает. - person Arno Bakker; 23.05.2012

Использование kCFAllocatorSystemDefault вместо kCFAllocatorDefault возвращает errSecSuccess.

person Adrian Procopenco    schedule 15.06.2012