3

我对 iOS 上的加密还很陌生,我一直遇到一个错误,我无法找到解决方案:

每当我尝试获取 iOS 钥匙串中公钥的 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 有错误的代码版本

调试器输出

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

4

1 回答 1

0

我在SecKeyCreateEncryptedData功能上遇到了同样的错误(用于替换SecKeyEncryptiOS 10+ 上的使用),它不是由 引起的SecKeyRef,而是CFDataRef由加密数据引起的。所以我建议检查加密数据,如plainBufferplainBufferSize等。

于 2019-10-05T10:34:09.887 回答