2015-04-16 10 views
5

Ich bin auf der Suche nach einem öffentlichen RSA-Schlüssel (PEM) aus dem Modul und Exponent in Objective-C. Diese Funktion kann in Java folgendermaßen ausgeführt werden:RSA öffentlichen Schlüssel aus Modul und Exponent generieren

PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(modulus, exponent)); 

Obwohl ich einige Probleme habe, dies für die iOS-Plattform zu schreiben. Bin mir bewusst, OpenSSL, aber ich konnte keine erfolgreiche Methode finden und bin immer noch nicht in der Lage, diesen Schlüssel zu generieren. Ich habe auch einen Blick auf SCZ-BasicEncodingRules-iOS geworfen, aber dies gibt einen NSData-Wert zurück und ich stecke fest, um herauszufinden, wie man versucht, es in einen NSString zu konvertieren.

+0

1. Nicht alle 'NSData' können in einen' NSString' konvertiert werden (oder generell können nicht alle 8-bit Bytes in Unicode Zeichen umgewandelt werden. 2. Bitte Stellen Sie einen Test-Modul und Exponent, welches Format sind die, hex, Base62, andere? – zaph

+0

Ich gebe normalerweise keine enge Abstimmung mit "unklar, was du fragst", aber dieser fällt in diese Kategorie. Was genau ist das Problem? Sie können Java unter iOS nicht ausführen? Oder Sie können ein 'NSData' nicht in ein' NSString' konvertieren? Außerdem ist ein öffentlicher RSA-Schlüssel *** *** der Modulus und der öffentliche Exponent, so dass nicht einmal klar ist, was Sie zu tun versuchen. – jww

Antwort

8

Wenn Sie ein .PEM-Format erstellen möchten, müssen Sie Base64 die Ausgabe von der berData-Methode codieren. Sie müssen auch die Kopf- und Fußzeilen hinzufügen.

Testdaten und Code finden Sie am Ende der Antwort für bytesFromHexString:

NSString *modulusString = @"c19bccae1e67743fab1c978f03122fb1a78ef05d565a2964728062ad0365e4751b8253df5fd13ab4ecb95c81ff17b91f969e4fb3d8274c30533338684278f6e5548027df775c055943a24a4117b0274c296c68b722c71670d4b21489a3da05d37ba06f2fb771b671a2c746bae4a049dc718fba19a75f1fb8ae1dd715b33d66a3"; 
NSString *exponentString = @"010001"; 

NSData *pubKeyModData = bytesFromHexString(modulusString); 
NSData *pubKeyExpData = bytesFromHexString(exponentString); 
NSArray *keyArray = @[pubKeyModData, pubKeyExpData]; 

//Given that you are using SCZ-BasicEncodingRules-iOS: 
NSData *berData = [keyArray berData]; 
NSLog(@"berData:\n%@", berData); 

NSString *berBase64 = [berData base64EncodedStringWithOptions:0]; 
NSString *preamble = @"-----BEGIN CERTIFICATE REQUEST-----"; 
NSString *postamble = @"-----END CERTIFICATE REQUEST-----"; 
NSString *pem = [NSString stringWithFormat:@"%@\n%@\n%@", preamble, berBase64, postamble]; 
NSLog(@"pem:\n%@", pem); 

Ausgabe mit Testdaten:

 
berData: 
30818802 8180c19b ccae1e67 743fab1c 978f0312 2fb1a78e f05d565a 29647280 62ad0365 e4751b82 53df5fd1 3ab4ecb9 5c81ff17 b91f969e 4fb3d827 4c305333 38684278 f6e55480 27df775c 055943a2 4a4117b0 274c296c 68b722c7 1670d4b2 1489a3da 05d37ba0 6f2fb771 b671a2c7 46bae4a0 49dc718f ba19a75f 1fb8ae1d d715b33d 66a30203 010001 

pem: 
-----BEGIN CERTIFICATE REQUEST----- 
    MIGIAoGAwZvMrh5ndD+rHJePAxIvsaeO8F1WWilkcoBirQNl5HUbglPfX9E6tOy5XIH/F7kflp5Ps9gnTDBTMzhoQnj25VSAJ993XAVZQ6JKQRewJ0wpbGi3IscWcNSyFImj2gXTe6BvL7dxtnGix0a65KBJ3HGPuhmnXx+4rh3XFbM9ZqMCAwEAAQ== 
-----END CERTIFICATE REQUEST----- 

Convert Hex-ASCII-Daten:

NSData* bytesFromHexString(NSString * aString) { 
    NSString *theString = [[aString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] componentsJoinedByString:nil]; 

    NSMutableData* data = [NSMutableData data]; 
    int idx; 
    for (idx = 0; idx+2 <= theString.length; idx+=2) { 
     NSRange range = NSMakeRange(idx, 2); 
     NSString* hexStr = [theString substringWithRange:range]; 
     NSScanner* scanner = [NSScanner scannerWithString:hexStr]; 
     unsigned int intValue; 
     if ([scanner scanHexInt:&intValue]) 
      [data appendBytes:&intValue length:1]; 
    } 
    return data; 
} 
+0

Darf ich fragen, welche Testdaten Sie im Array verwendet haben? Genauer gesagt, das korrekte Format, um in diesem Fall von einer Zeichenfolge zu nsdata zu wechseln. – Harry

+0

Das ist gut, aber wissen Sie von einer einfachen Möglichkeit, das Array in PEM-Format zu konvertieren, das in einem reinen Swift-Projekt funktionieren wird (ohne Bridging zu Objective-C)? Danke – qtyq

+0

Ich habe versucht, das selbe in swift, aber es gibt falsche Schlüsselgröße aus. Könnten Sie diese Frage überprüfen? http://stackoverflow.com/questions/43637323/rsa-public-key-generation-swift –

Verwandte Themen