2009-04-25 14 views
14

Sto sviluppando l'applicazione Iphone. Ho usato il metodo SecKeyGeneratePair del framework Security/Security.h. Sto ottenendo le chiavi private pubbliche & come oggetti SecKeyRef. Posso accedere alla chiave o stampare il suo valore su console? Posso ottenere oggetti NSString o NSData da esso? Quando stampo la chiave per la console usando NSLog, sto ottenendo. Possiamo passare questi oggetti chiave sulla rete ad altre applicazioni che potrebbero essere in java? Possiamo crittografare del testo nell'applicazione iphone, inviarlo al server, utilizzando la chiave inviata decrittografare il testo sul lato server?Codifica RSA-Decrittografia in iphone

Modificato per aggiungere Grazie Alex Reynolds per la tua rapida risposta. Nel caso di RSA Encryption devo prima generare una coppia di chiavi che è sotto forma di oggetti SecKeyRef. Quindi passeremo tale riferimento ai metodi SecKeyEncrypt & SecKeyDecrypt. quando crittografo & localmente funziona perfettamente ma se provo a inviare la chiave & dati crittografati al server & decrypt sul lato server (implementazione java), non sono in grado di passare l'oggetto SecKeyRef al server come valore chiave. In java dobbiamo ottenere la stringa in formato stringa o array di byte per passare al metodo di crittografia. Possiamo ottenere l'accesso ai dati memorizzati nell'oggetto SecKeyRef (che è l'oggetto NSCFType)? che è una struct __SecKey.

risposta

9

Considerare l'utilizzo di NSData per ottenere il valore di stringa, e forse utilizzare Base64 o qualche altra forma di codifica quando si passa attraverso la rete (e quindi decodificare da Base64 a qualsiasi cosa in Java).

Ecco un esempio di codice che potrebbe aiutarti a iniziare. Sto facendo una firma HMAC-SHA1 ('digerire') qui, ma l'idea generale è la stessa per il vostro 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

Please help me, non capisco come passare l'istanza SecKeyRef a i metodi in questa risposta. Il metodo riceve (NSString *) ma ho bisogno di trovare un modo per estrarre la stringa dal SecKeyRef –