SecKeyEncrypt returns 错误安全参数

SecKeyEncrypt returns errSecParam

我正在尝试使用 SecKeyEncrypt 函数加密一些 NSData。问题是,它 returns 是一个错误 -50,根据文档是

errSecParam
One or more parameters passed to the function are not valid.

问题是,我找不到我的功能有什么问题。代码如下

- (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 创建的,其中 returns errSecSuccess。如您所见,我正在尝试使用私钥加密数据,而不是 public 私钥,因此我添加了

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

生成私钥参数,但不幸的是,这没有帮助。

这里有什么问题?

我设法找到了解决方案。

我实际上想做的是对数据进行签名(这就是为什么我使用私钥加密而不是 public 的原因),但事实证明 CommonCrypto 有一个特定的功能正因为如此,所以使用

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

解决了问题。