SecKeyEncrypt возвращает errSecParam

Я пытаюсь зашифровать некоторые 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 ответ

Решение

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

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

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

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

Другие вопросы по тегам