Generate RSA public key from the module and indicator

I am looking to generate the rsa (pem) public key from both a module and an exponent in Objective-C. This function can be performed in Java as follows:

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

Although I am having trouble writing this for the iOS platform. I know OpenSSL , but I could not find a successful method and still can not generate this key. Also reviewed SCZ-BasicEncodingRules-iOS , but this returns an NSData value, and I'm stuck trying to figure out how to try converting it to NSString.

+5
source share
1 answer

If you want to create the .PEM format, you will need to base64 encode the output from the berData method. You also need to add header and footer lines.

Check the data and code, see the end of the answer for 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); ; 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); 

Output with test data:

  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 to data:

 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; } 
+8
source

All Articles