首页 > 解决方案 > 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];
}

使用SecKeyGeneratePairwhich return创建密钥errSecSuccess。如您所见,我正在尝试使用私钥而不是公钥加密数据,所以我添加了

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

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

这里有什么问题?

标签: iosobjective-ccommoncrypto

解决方案


我设法找到了解决方案。

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

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

解决了这个问题。


推荐阅读