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

时间:2015-02-15 02:55:43

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

我在iOS上加密非常新,而且我遇到了一个错误,我无法找到解决方案:

每当我尝试将SecKeyRef添加到iOS钥匙串中的公钥并使用它时,我最终会出现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分配一些东西,因为地址的值不是"#0; 0x0"但是我不断得到EXC_BAD_ACCESS错误,无论我是什么&已经尝试过了。在此问题上非常感谢任何和所有帮助。

1 个答案:

答案 0 :(得分:0)

我在使用SecKeyCreateEncryptedData函数时遇到了相同的错误(该错误旨在替换iOS 10+上SecKeyEncrypt的用法),不是由SecKeyRef引起的,而是{ {1}}是加密数据。因此,我建议检查诸如CFDataRefplainBuffer等加密数据。