我使用SecKeyGeneratePair
生成了私钥和公钥
我已将SecKeyRef
转换为NSData
size_t keySize = SecKeyGetBlockSize(publicKey);
NSData * keyData = [NSData dataWithBytes:publicKey length:keySize];
但不幸的是,我无法在keyData
类型中重新转换SecKeyRef
。
以下是问题: 如何在SecKeyRef类型中重新转换NSData?
这是代码!
//
// RSA.m
// example
//
// Created by Ferdinando Picone on 07/11/13.
// Copyright (c) 2013 Ferdinando Picone. All rights reserved.
//
#import "RSA.h"
#import <Security/Security.h>
#import "NSData+Base64.h"
static const UInt8 publicKeyIdentifier[] = "com.apple.sample.publickey\0";
static const UInt8 privateKeyIdentifier[] = "com.apple.sample.privatekey\0";
SecKeyRef publicKey = NULL;
SecKeyRef privateKey = NULL;
@implementation RSA
-(void)start{
RSA *one = [[RSA alloc]init];
// Generate public and private key
[one generateKeyPairPlease];
NSLog(@" %@", publicKey);
NSLog(@" %@", privateKey);
//Convert public key in NSData Type
size_t keySize = SecKeyGetBlockSize(publicKey);
NSData *keyData = [NSData dataWithBytes:publicKey length:keySize];
NSLog (@" %@", keyData);
//Convert public key in NSString Type
NSString *keyStringB64 =[keyData base64EncodedString];
//Reconvert NSString in a NSData Type (newKeyData)
NSData *newKeyData = [NSData dataFromBase64String:keyStringB64];
NSLog(@" %@", newKeyData);
// In the debug you can see that keyData==newKeyData
// NOW I NEED TO RECONVERT newKeyData in a SecKeyRef newPublicKey
SecKeyRef newPublicKey=NULL;
}
-(void) generateKeyPairPlease{
OSStatus status = noErr;
NSMutableDictionary *privateKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary *publicKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary *keyPairAttr = [[NSMutableDictionary alloc] init];
NSData * publicTag = [NSData dataWithBytes:publicKeyIdentifier
length:strlen((const char *)publicKeyIdentifier)];
NSData * privateTag = [NSData dataWithBytes:privateKeyIdentifier
length:strlen((const char *)privateKeyIdentifier)];
[keyPairAttr setObject:(__bridge id)kSecAttrKeyTypeRSA
forKey:(__bridge id)kSecAttrKeyType];
[keyPairAttr setObject:[NSNumber numberWithInt:1024]
forKey:(__bridge id)kSecAttrKeySizeInBits];
[privateKeyAttr setObject:[NSNumber numberWithBool:YES]
forKey:(__bridge id)kSecAttrIsPermanent];
[privateKeyAttr setObject:privateTag
forKey:(__bridge id)kSecAttrApplicationTag];
[publicKeyAttr setObject:[NSNumber numberWithBool:YES]
forKey:(__bridge id)kSecAttrIsPermanent];
[publicKeyAttr setObject:publicTag
forKey:(__bridge id)kSecAttrApplicationTag];
[keyPairAttr setObject:privateKeyAttr
forKey:(__bridge id)kSecPrivateKeyAttrs];
[keyPairAttr setObject:publicKeyAttr
forKey:(__bridge id)kSecPublicKeyAttrs];
status = SecKeyGeneratePair((__bridge CFDictionaryRef)keyPairAttr,
&publicKey, &privateKey);
}
@end
答案 0 :(得分:0)
您可以使用iOS 10.10中提供的API从NSData创建SecKeyRef
<table class="container">
<tr class='A'>
<td><a href="first_a_example.com">Hello</a></td>
<td> ... </td>
<td><a href="example.com">Dummy link a</a></td>
<td> ... </td>
<td> ... </td>
</tr>
<tr class='B'>
<td><a href="example.com">Dummy link b</a></td>
<td> ... </td>
<td><a href="example.com">Dummy link b</a></td>
<td> ... </td>
<td> ... </td>
</tr>
<tr class='A'>
<td><a href="second_example.com">Dummy link a</a></td>
<td> ... </td>
<td><a href="example.com">Dummy link a</a>
</td>
<td> ... </td>
<td> ... </td>
</tr>
...
</table>