SecKeyEncrypt возвращает errSecParam - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь зашифровать некоторые NSData с помощью функции SecKeyEncrypt.Проблема в том, что он возвращает ошибку -50, которая согласно документации равна

errSecParam
Один или несколько параметров, переданных в функцию, недопустимы.

Проблема в том, что я не могу найти что-то не так с моей функцией.Код выглядит следующим образом:

- (NSData *)encryptWithPrivateKey:(NSData *)plainData
{
    if (!privateKeyRef) {
        RBLog(@"No private key");
        return nil;
    }
    if (!plainData.length) {
        RBLog(@"Plain data empty");
        return nil;
    }

    size_t blockSize = SecKeyGetBlockSize(privateKeyRef); // 128
    NSMutableData *encryptedData = [[NSMutableData alloc] initWithCapacity:blockSize]; // using capacity of 1024 changes nothing
    size_t encryptedDataLen = blockSize;

    OSStatus status = SecKeyEncrypt(privateKeyRef,
                                    kSecPaddingPKCS1,
                                    (const uint8_t *)plainData.bytes,
                                    plainData.length,
                                    (uint8_t *)encryptedData.bytes,
                                    &encryptedDataLen);

    if (status != errSecSuccess) {
        RBLog(@"Could not encrypt, OS status %@", @(status));
    }
    return [NSData dataWithData:encryptedData];
}

Ключ создается с помощью SecKeyGeneratePair, который возвращает errSecSuccess.Как вы видите, я пытаюсь зашифровать данные с помощью закрытого ключа, а не открытого, поэтому я добавил

[privateKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecAttrCanEncrypt];

к параметрам закрытого ключа при генерации, но, к сожалению, это не помогло.

В чем здесь проблема?

1 Ответ

0 голосов
/ 11 мая 2018

Мне удалось найти решение.

Что я на самом деле хотел сделать, так это подписать данные (именно поэтому я использовал для шифрования закрытый ключ вместо открытого), но оказывается, что CommonCrypto имеет специальную функцию именно для этого, поэтому использование

OSStatus status = SecKeyRawSign(privateKeyRef,
                                kPadding,
                                (const uint8_t *)plainText.bytes,
                                plainText.length,
                                (uint8_t *)encryptedData.bytes,
                                &encryptedDataLen);

решил проблему.

...