2009-04-25 14 views
14

Ich entwickle Iphone-Anwendung. Ich habe die SecKeyGeneratePair-Methode des Security/Security.h-Frameworks verwendet. Ich bekomme öffentliche Schlüssel & als SecKeyRef Objekte. Kann ich auf den Schlüssel zugreifen oder seinen Wert auf die Konsole drucken? Kann ich ein NSString- oder NSData-Objekt daraus erhalten? Wenn ich den Schlüssel zur Konsole mit NSLog drucke, bekomme ich. Können wir diese Schlüsselobjekte über das Netzwerk an andere Anwendungen weitergeben, die sich in Java befinden? Können wir Text in der iPhone-Anwendung verschlüsseln, an den Server senden und den gesendeten Schlüssel verwenden, um den Text auf der Serverseite zu entschlüsseln?RSA-Verschlüsselung-Entschlüsselung in iPhone

Bearbeitet um hinzuzufügen Danke Alex Reynolds für Ihre schnelle Antwort. Im Falle der RSA-Verschlüsselung muss ich zuerst ein Schlüsselpaar in Form von SecKeyRef-Objekten generieren. Dann werden wir diesen Verweis SecKeyEncrypt & SecKeyDecrypt-Methoden übergeben. wenn ich verschlüsseln & lokal entschlüsseln funktioniert es perfekt, aber wenn ich versuche, den Schlüssel & verschlüsselte Daten an Server & entschlüsseln auf Server (Java-Implementierung) Seite, ich bin nicht in der Lage, das SecKeyRef-Objekt an Server als Schlüsselwert zu übergeben. In Java müssen wir die Zeichenfolge im String- oder Byte-Array-Format abrufen, um sie an die Verschlüsselungsmethode zu übergeben. Können wir den Zugriff auf die im Objekt SecKeyRef (welches NSCFType-Objekt) gespeicherten Daten erhalten? Das ist eine Struktur __SecKey.

Antwort

9

Verwenden Sie NSData, um den Zeichenfolgenwert zu erhalten, und verwenden Sie möglicherweise Base64 oder eine andere Form der Codierung, wenn Sie das Netzwerk übergeben (und dann von Base64 in Java dekodieren).

Hier ist ein Beispiel für einen Code, der Ihnen den Einstieg erleichtern könnte. Ich bin eine HMAC-SHA1-Signatur (‚verdaut‘) hier zu tun, aber die allgemeine Idee ist das gleiche für Ihren RSA Fall:

#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

Bitte helfen Sie mir, ich verstehe nicht, wie die SecKeyRef Instanz zu übergeben die Methoden in dieser Antwort. Die Methode empfängt (NSString *), aber ich muss einen Weg finden, die Zeichenfolge aus dem SecKeyRef zu extrahieren –