2012-04-08 24 views
6

Después de Apple ejemplo de código en: http://developer.apple.com/library/ios/#documentation/Security/Conceptual/CertKeyTrustProgGuide/iPhone_Tasks/iPhone_Tasks.htmlGenerar par de claves en el iPhone e impresión para iniciar la sesión como NSString

soy capaz de generar correctamente par de claves con el siguiente fragmento de código, pero no puede imprimir las teclas ...

La función SecKeyGeneratePair() - devuelve las claves como tipo SecKeyRef.

No tengo idea de cómo manejar este tipo, entiendo que esta es la representación del llavero, pero ¿cómo puedo ver realmente el par de claves como NSString? Más específicamente, ¿cómo convertir SecKeyRef a NSString?

static const UInt8 publicKeyIdentifier[] = "com.apple.sample.publickey\0"; 
static const UInt8 privateKeyIdentifier[] = "com.apple.sample.privatekey\0"; 
                  // 1 


- (void)generateKeyPairPlease 
{ 
    OSStatus status = noErr; 
    NSMutableDictionary *privateKeyAttr = [[NSMutableDictionary alloc] init]; 
    NSMutableDictionary *publicKeyAttr = [[NSMutableDictionary alloc] init]; 
    NSMutableDictionary *keyPairAttr = [[NSMutableDictionary alloc] init]; 
                   // 2 

    NSData * publicTag = [NSData dataWithBytes:publicKeyIdentifier 
           length:strlen((const char *)publicKeyIdentifier)]; 
    NSData * privateTag = [NSData dataWithBytes:privateKeyIdentifier 
           length:strlen((const char *)privateKeyIdentifier)]; 
                   // 3 

    SecKeyRef publicKey = NULL; 
    SecKeyRef privateKey = NULL;        // 4 

    [keyPairAttr setObject:(id)kSecAttrKeyTypeRSA 
            forKey:(id)kSecAttrKeyType]; // 5 
    [keyPairAttr setObject:[NSNumber numberWithInt:1024] 
          forKey:(id)kSecAttrKeySizeInBits]; // 6 

    [privateKeyAttr setObject:[NSNumber numberWithBool:YES] 
           forKey:(id)kSecAttrIsPermanent]; // 7 
    [privateKeyAttr setObject:privateTag 
          forKey:(id)kSecAttrApplicationTag]; // 8 

    [publicKeyAttr setObject:[NSNumber numberWithBool:YES] 
           forKey:(id)kSecAttrIsPermanent]; // 9 
    [publicKeyAttr setObject:publicTag 
          forKey:(id)kSecAttrApplicationTag]; // 10 

    [keyPairAttr setObject:privateKeyAttr 
           forKey:(id)kSecPrivateKeyAttrs]; // 11 
    [keyPairAttr setObject:publicKeyAttr 
           forKey:(id)kSecPublicKeyAttrs]; // 12 

    status = SecKeyGeneratePair((CFDictionaryRef)keyPairAttr, 
             &publicKey, &privateKey); // 13 
// error handling... 


    if(privateKeyAttr) [privateKeyAttr release]; 
    if(publicKeyAttr) [publicKeyAttr release]; 
    if(keyPairAttr) [keyPairAttr release]; 
    if(publicKey) CFRelease(publicKey); 
    if(privateKey) CFRelease(privateKey);      // 14 
} 
+0

capaz de generar claves par ... Se trata de dar valor para el estado 'OSStatus' ** - 34018 ** – Sujay

Respuesta

7

Puede usar SecItemCopyMatching para obtener NSData de la clave. Consulte el método getPublicKeyBits en Apple's CryptoExercise, implementa exactamente lo que necesita.

Luego puede convertir NSData en una cadena. Quizás, la codificación Base64 satisfaga sus necesidades. Here puede encontrar la muestra de codificación/decodificación Base64 para iPhone. Alternativamente, este answer también puede ser útil para la codificación Base64.

+0

gracias, uso getPublicKeyBits y hago r percibir el valor como NSData, aunque hay algo raro, al crear el par de claves especifico kSecAttrKeySizeInBits = 1024, pero el tamaño de NSData (recibido de getPublicKeyBits) es de 140 bytes (en lugar de los 128 esperados) ¿alguna idea de por qué? –

+1

Esto probablemente se deba al formato que se usa para almacenar claves. No estoy seguro de cuál es la razón por la que está imprimiendo las claves. Checkout [this] (http://blog.wingsofhermes.org/?p=42) and [this] (http://blog.flirble.org/2011/01/05/rsa-public-key-openssl-ios /) enlaces que analizan formas de trabajar con claves de iOS. – tenorsax

+0

Puedo obtener el NSData y generar un uso de NSString: '[data base64EncodedDataWithOptions: NSDataBase64Encoding64CharacterLineLength]; [[NSString alloc] initWithData: codificación base64Data: NSUTF8StringEncoding]; '. Pero no puede usar este NSString para encriptar. SOS –

0
-(void)writePublicKeyModAndExp 
{ 
    KeyHelper* keyHelper =[[KeyHelper alloc]init]; 
    NSData* pubkeyData= [keyHelper getPublicKeyBitsWithtag:publicTag]; 

    NSLog(@"pubKey :%@",[pubkeyData base64Encoding]); 

    NSData *modData= [keyHelper getPublicKeyModFromKeyData:pubkeyData]; 
    NSLog(@"modulus :%@",[modData base64Encoding]); 

    NSData *expoData= [keyHelper getPublicKeyExpFromKeyData:pubkeyData]; 
    NSLog(@"exponent :%@",[expoData base64Encoding]); 
} 

Puede encontrar el código entero aquí https://github.com/ozgurshn/EncryptionForiOS

2

Puede utilizar https://github.com/henrinormak/Heimdall

let localHeimdall = Heimdall(tagPrefix: "com.example") 

if let heimdall = localHeimdall { 
    let publicKeyData = heimdall.X509PublicKey() 
    var publicKeyString = publicKeyData.base64EncodedStringWithOptions(.allZeros) 

    // If you want to make this string URL safe, 
    // you have to remember to do the reverse on the other side later 
    publicKeyString = publicKeyString.stringByReplacingOccurrencesOfString("/", withString: "_") 
    publicKeyString = publicKeyString.stringByReplacingOccurrencesOfString("+", withString: "-") 

    println(publicKeyString) // Something along the lines of "MIGfMA0GCSqGSIb3DQEBAQUAA..." 

    // Data transmission of public key to the other party 
} 

rápida 3:

let localHeimdall = Heimdall(tagPrefix: "com.example") 
if let heimdall = localHeimdall, publicKeyData = heimdall.publicKeyDataX509() { 

    var publicKeyString = publicKeyData.base64EncodedString() 

    // If you want to make this string URL safe, 
    // you have to remember to do the reverse on the other side later 
    publicKeyString = publicKeyString.replacingOccurrences(of: "/", with: "_") 
    publicKeyString = publicKeyString.replacingOccurrences(of: "+", with: "-") 

    println(publicKeyString) // Something along the lines of "MIGfMA0GCSqGSIb3DQEBAQUAA..." 

    // Data transmission of public key to the other party 
} 
No
+0

Aún no funciona con Swift 3. –

+0

código agregado para swift 3 – phnmnn

Cuestiones relacionadas