我对 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
);
这是错误和调试窗口的一些屏幕截图:
似乎有一些东西被分配给了 SecKeyRef,因为地址的值不是“0x0”,但无论我尝试了什么,我都不断收到 EXC_BAD_ACCESS 错误。非常感谢有关此问题的任何和所有帮助。
最佳答案
我在使用 SecKeyCreateEncryptedData
函数时遇到了同样的错误(该函数旨在替换 iOS 10+ 上 SecKeyEncrypt
的使用),它不是由 引起的SecKeyRef
,但CFDataRef
是加密数据。所以我建议检查加密数据,如 plainBuffer
、plainBufferSize
等。
关于ios - 使用 SecItemCopyMatching 时,SecKeyRef 导致 EXC_BAD_ACCESS (code=1) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28522578/