首页 > 开发 > iOS > 正文

iOS,rsa加密随机发生失败

2017-09-08 13:53:58  来源:网友分享
+ (SecKeyRef)addPublicKey:(NSString *)key{    NSRange spos = [key rangeOfString:@"-----BEGIN PUBLIC KEY-----"];    NSRange epos = [key rangeOfString:@"-----END PUBLIC KEY-----"];    if(spos.location != NSNotFound && epos.location != NSNotFound){        NSUInteger s = spos.location + spos.length;        NSUInteger e = epos.location;        NSRange range = NSMakeRange(s, e-s);        key = [key substringWithRange:range];    }    key = [key stringByReplacingOccurrencesOfString:@"\r" withString:@""];    key = [key stringByReplacingOccurrencesOfString:@"\n" withString:@""];    key = [key stringByReplacingOccurrencesOfString:@"\t" withString:@""];    key = [key stringByReplacingOccurrencesOfString:@" "  withString:@""];        NSData *data = [RSA hexStrToNSData:key];    data = [RSA stripPublicKeyHeader:data];    if(!data){        return nil;    }        NSString *tag = @"what_the_fuck_is_this";    NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]];        // Delete any old lingering key with the same tag    NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init];    [publicKey setObject:(__bridge id) kSecClassKey forKey:(__bridge id)kSecClass];    [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];    [publicKey setObject:d_tag forKey:(__bridge id)kSecAttrApplicationTag];    SecItemDelete((__bridge CFDictionaryRef)publicKey);        // Add persistent version of the key to system keychain    [publicKey setObject:data forKey:(__bridge id)kSecValueData];    [publicKey setObject:(__bridge id) kSecAttrKeyClassPublic forKey:(__bridge id)     kSecAttrKeyClass];    [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)     kSecReturnPersistentRef];        CFTypeRef persistKey = nil;    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)publicKey, &persistKey);    if (persistKey != nil){        CFRelease(persistKey);    }    if ((status != noErr) && (status != errSecDuplicateItem)) {        return nil;    }        [publicKey removeObjectForKey:(__bridge id)kSecValueData];    [publicKey removeObjectForKey:(__bridge id)kSecReturnPersistentRef];    [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];    [publicKey setObject:(__bridge id) kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];        // Now fetch the SecKeyRef version of the key    SecKeyRef keyRef = nil;    status = SecItemCopyMatching((__bridge CFDictionaryRef)publicKey, (CFTypeRef *)&keyRef);    if(status != noErr){        return nil;    }    return keyRef;}

这里的keyRef有的时候会是nil,有知道知道问题在哪么?
当keyRef变成nil的时候,key是值得,
现在找资料发现是在iOS9上有的时候会出现但是在iOS10上就成了必现了keyRef=nil。

解决方案

rsa加密字符串返回nil
解决办法:开启Capabilities的KeychainSharing功能
参考:http://www.cocoachina.com/bbs...