2009-04-25 13 views
14

estoy desarrollando la aplicación Iphone. He utilizado el método SecKeyGeneratePair de Security/Security.h framework. Me estoy haciendo & claves privadas públicas como objetos SecKeyRef. ¿Puedo acceder a la clave o imprimir su valor a la consola? ¿Puedo obtener un objeto NSString o NSData de él? Cuando imprimo la clave de la consola usando NSLog, estoy obteniendo. ¿Podemos pasar estos objetos clave por la red a otra aplicación que pueda estar en Java? ¿Podemos cifrar algo de texto en la aplicación iphone, enviarlo al servidor, usando la clave que se envía para descifrar el texto en el lado del servidor?cifrado RSA-descifrado en iPhone

Editado para agregar Gracias Alex Reynolds por su pronta respuesta. En el caso de la encriptación RSA, primero tengo que generar un par de claves que está en forma de objetos SecKeyRef. A continuación, pasaremos que la referencia a SecKeyEncrypt & métodos SecKeyDecrypt. cuando cifro & descifrar localmente funciona perfectamente, pero si intento enviar la clave & datos cifrados al servidor & descifrar en el servidor (implementación java), no puedo pasar el objeto SecKeyRef al servidor como valor clave. En java tenemos que obtener la cadena en formato de cadena o de matriz de bytes para pasar al método de encriptación. ¿Podemos obtener acceso a los datos almacenados en el objeto SecKeyRef (que es un objeto NSCFType)? que es una estructura __SecKey.

Respuesta

9

considerar el uso de NSData para obtener el valor de la cadena, y tal vez usar base 64 o alguna otra forma de codificación cuando pasa a través de la red (y luego se decodifica de base 64 a lo que en Java).

He aquí un ejemplo de un código que podría ayudarle a empezar. Estoy haciendo una firma HMAC-SHA1 ('digerir') aquí, pero la idea general es la misma para su caso RSA:

#import <Foundation/NSString.h> 
#import <CommonCrypto/CommonHMAC.h> 
#import <CommonCrypto/CommonDigest.h> 

@interface NSString (NSStringAdditions) 

+ (NSString *) base64StringFromData:(NSData *)data length:(int)length; 
- (NSString *) base64StringWithHMACSHA1Digest:(NSString *)secretKey; 

@end 

------------------------------------------- 

#import "NSStringAdditions.h" 

static char base64EncodingTable[64] = { 
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 
    'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' 
}; 

@implementation NSString (NSStringAdditions) 

- (NSString *) base64StringWithHMACSHA1Digest:(NSString *)secretKey { 
    unsigned char digest[CC_SHA1_DIGEST_LENGTH]; 
    char *keyCharPtr = strdup([secretKey UTF8String]); 
    char *dataCharPtr = strdup([self UTF8String]); 

    CCHmacContext hctx; 
    CCHmacInit(&hctx, kCCHmacAlgSHA1, keyCharPtr, strlen(keyCharPtr)); 
    CCHmacUpdate(&hctx, dataCharPtr, strlen(dataCharPtr)); 
    CCHmacFinal(&hctx, digest); 
    NSData *encryptedStringData = [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; 

    free(keyCharPtr); 
    free(dataCharPtr); 

    return [NSString base64StringFromData:encryptedStringData length:[encryptedStringData length]]; 
} 

+ (NSString *) base64StringFromData: (NSData *)data length: (int)length { 
    unsigned long ixtext, lentext; 
    long ctremaining; 
    unsigned char input[3], output[4]; 
    short i, charsonline = 0, ctcopy; 
    const unsigned char *raw; 
    NSMutableString *result; 

    lentext = [data length]; 
    if (lentext < 1) 
    return @""; 
    result = [NSMutableString stringWithCapacity: lentext]; 
    raw = [data bytes]; 
    ixtext = 0; 

    while (true) { 
    ctremaining = lentext - ixtext; 
    if (ctremaining <= 0) 
     break;   
    for (i = 0; i < 3; i++) { 
     unsigned long ix = ixtext + i; 
     if (ix < lentext) 
      input[i] = raw[ix]; 
     else 
      input[i] = 0; 
    } 
    output[0] = (input[0] & 0xFC) >> 2; 
    output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4); 
    output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6); 
    output[3] = input[2] & 0x3F; 
    ctcopy = 4; 

    switch (ctremaining) { 
     case 1: 
     ctcopy = 2; 
     break; 
     case 2: 
     ctcopy = 3; 
     break; 
    } 

    for (i = 0; i < ctcopy; i++) 
     [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]]; 

    for (i = ctcopy; i < 4; i++) 
     [result appendString: @"="]; 

    ixtext += 3; 
    charsonline += 4; 

    if ((length > 0) && (charsonline >= length)) 
     charsonline = 0; 

    return result; 
} 

@end 
+0

Por favor, ayúdame, no entiendo cómo pasar a la instancia SecKeyRef los métodos en esta respuesta. El método recibe (NSString *) pero necesito encontrar una forma de extraer la cadena de SecKeyRef –