ios - 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
which return创建密钥errSecSuccess
。如您所见,我正在尝试使用私钥而不是公钥加密数据,所以我添加了
[privateKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecAttrCanEncrypt];
生成时生成私钥参数,但不幸的是没有帮助。
这里有什么问题?
解决方案
我设法找到了解决方案。
我真正想做的是对数据进行签名(这就是为什么我使用私钥而不是公钥来加密),但事实证明它CommonCrypto
有一个特定的功能,所以使用
OSStatus status = SecKeyRawSign(privateKeyRef,
kPadding,
(const uint8_t *)plainText.bytes,
plainText.length,
(uint8_t *)encryptedData.bytes,
&encryptedDataLen);
解决了这个问题。
推荐阅读
- apache-kafka - 使用 ksqlDB 写入现有主题
- javascript - Push into an array useState React
- postman - 尝试在我的网站中集成 ZOHO API 时。Zoho API 调用在 POST Man 工具中工作,但在代码中不起作用,为什么?
- python - R1732:考虑使用“with”进行资源分配操作(考虑使用-with)
- reactjs - 如何在反应原生博览会上每次在同一视图上倒计时
- node.js - 如何在 Node jS 中集成 OIDC Provider
- python - 是否可以在没有换行符的情况下获得用户输入(多行消息)
- python - 如何在 PyTorch 的损失函数中将张量的梯度作为参数传递?
- symfony - 多选下拉/复选框 Symfony 3.4 Form
- c++ - 捕获组标准 C++ RegEx 和 PCRE 中只有 1 个匹配项