Tôi có hai khóa, công khai và riêng tư, cả hai đều được lưu trữ trong các biến SecKeyRef. Để đơn giản, hãy bắt đầu với công chúng. Những gì tôi muốn làm là xuất nó sang một đối tượng NSData. Cho rằng, có một đoạn mã gần như nổi tiếng cung cấp bởi Apple, mà là ở đây:iOS SecKeyRef đến NSData
- (NSData *)getPublicKeyBits {
OSStatus sanityCheck = noErr;
NSData * publicKeyBits = nil;
NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
// Set the public key query dictionary.
[queryPublicKey setObject:(id)kSecClassKey forKey:(id)kSecClass];
[queryPublicKey setObject:publicTag forKey:(id)kSecAttrApplicationTag];
[queryPublicKey setObject:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
[queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnData];
// Get the key bits.
sanityCheck = SecItemCopyMatching((CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits);
if (sanityCheck != noErr)
{
publicKeyBits = nil;
}
[queryPublicKey release];
return publicKeyBits;
}
Tôi có Xcode 4.6.2, tuy nhiên, và mã xuất hiện có sai sót ("__bridge" được thêm vào trước mỗi chuyển đổi sang id). Phiên bản mới trông như thế này:
- (NSData *)getPublicKeyBitsFromKey:(SecKeyRef)givenKey {
OSStatus sanityCheck = noErr;
NSData * publicKeyBits = nil;
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)kSecReturnData];
// Get the key bits.
sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyBits);
if (sanityCheck != noErr)
{
publicKeyBits = nil;
}
return publicKeyBits;
}
Hiện vẫn còn hai lỗi, mặc dù:
- sử dụng định danh chưa được khai báo 'publicTag'
- Cast của một con trỏ gián tiếp đến một con trỏ Objective-C để 'CFTypeRef ' (aka 'khoảng trống const *') là không được phép với ARC
Bây giờ, tôi hy vọng rằng sau khi giúp đỡ của bạn, vấn đề đầu tiên w bệnh không còn là một vấn đề, vì tôi không muốn xây dựng một truy vấn hoặc không có gì để trích xuất khóa từ keychain. Tôi có nó trong một biến và tôi muốn trích xuất nó từ đó. Tên biến là givenPublicKey
và đó là khóa tôi muốn chuyển đổi thành NSData.
Vì vậy, làm cách nào để tôi thực hiện việc này và giải quyết vấn đề ARC này?
Theo dõi: Làm cách nào để xuất khóa riêng sang NSData, vì tôi đã đọc một vài lần chức năng mà tôi đang cố gắng làm việc chỉ hoạt động với khóa công khai.
Bạn có thể tham chiếu đoạn mã tới tài liệu/trang web của Apple không? – MCKapur
Chắc chắn, đây là: http://developer.apple.com/library/ios/#samplecode/CryptoExercise/Listings/Classes_SecKeyWrapper_m.html#//apple_ref/doc/uid/DTS40008019-Classes_SecKeyWrapper_m-DontLinkElementID_17 – arik