ios - 使用 SecItemCopyMatching 时,SecKeyRef 导致 EXC_BAD_ACCESS (code=1) 错误

标签 ios null exc-bad-access public-key-encryption seckeyref

我对 iOS 上的加密相当陌生,并且遇到了一个错误,但无法找到解决方案:

每当我尝试获取 iOS 钥匙串(keychain)中公钥的 SecKeyRef 并使用它时,都会出现 EXC_BAD_ACCESS 错误。 SecKeyRef(在我下面的代码中称为“publicKeyReference”)最初设置为 NULL,但在调用 SecItemCopyMatching 方法后它应该有一个值,这可以从调试器窗口中的内存地址看到。

这是我的代码:

SecKeyRef publicKeyReference = NULL;
NSData* publicTag = [publicKeyIdentifier dataUsingEncoding:NSUTF8StringEncoding];


NSMutableDictionary *queryPublicKey = [[NSMutableDictionary alloc] init];

// Set the public key query dictionary.
[queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag];
[queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnPersistentRef];

// Get the key.
sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyReference);

// Encrypt using the public.
sanityCheck = SecKeyEncrypt(    publicKeyReference,
                       PADDING,
                       plainBuffer,
                       plainBufferSize,
                       &cipherBuffer[0],
                       &cipherBufferSize
                       );        

这是错误和调试窗口的一些屏幕截图:

Xcode Version of Code with error

Debugger Output

似乎有一些东西被分配给了 SecKeyRef,因为地址的值不是“0x0”,但无论我尝试了什么,我都不断收到 EXC_BAD_ACCESS 错误。非常感谢有关此问题的任何和所有帮助。

最佳答案

我在使用 SecKeyCreateEncryptedData 函数时遇到了同样的错误(该函数旨在替换 iOS 10+ 上 SecKeyEncrypt 的使用),它不是由 引起的SecKeyRef,但CFDataRef是加密数据。所以我建议检查加密数据,如 plainBufferplainBufferSize 等。

关于ios - 使用 SecItemCopyMatching 时,SecKeyRef 导致 EXC_BAD_ACCESS (code=1) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28522578/

相关文章:

ruby - 当起始索引大于 (array.size -1) 时,关于 ruby​​ Array [] 方法的混淆结果

ios - 程序收到信号: "EXC_BAD_ACCESS"

ios EXC_BAD_ACCESS 上的一个实现

ios - 如何在 Xcode 中创建归档快捷方式?

ios - 快速将 GPS 元数据字典添加到使用 AVFoundation 拍摄的图像

c - 将带有\0 字符的字符数组传递给其他函数

validation - 企业库验证 block - 验证可为空的属性?

iphone - 如何正确处理异常情况(信号?)

ios - 从 plist 加载的注释不显示

ios - 如何删除 CocoaPods 安装的库?