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);
解决了问题。
我正在尝试使用 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);
解决了问题。