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);
решил проблему.