从模和指数生成RSA公钥

我正在寻找从Objective-C中的模数和指数生成rsa公钥(pem)。 这个function可以通过以下方式在Java中完成:

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

虽然我在写这个iOS平台时遇到了一些麻烦。 我知道OpenSSL ,但我找不到一个成功的方法,仍然无法生成此密钥。 也看看SCZ-BasicEncodingRules-iOS,但是这返回一个NSData值,我卡住试图找出如何尝试将其转换为NSString。

如果你想创build一个.PEM格式,你需要base64对berData方法的输出进行编码。 您还需要添加页眉和页脚行。

testing数据和代码,查看bytesFromHexString答案的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); 

输出testing数据:

 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:
 -----开始证书申请-----
   MIGIAoGAwZvMrh5ndD + rHJePAxIvsaeO8F1WWilkcoBirQNl5HUbglPfX9E6tOy5XIH / F7kflp5Ps9gnTDBTMzhoQnj25VSAJ993XAVZQ6JKQRewJ0wpbGi3IscWcNSyFImj2gXTe6BvL7dxtnGix0a65KBJ3HGPuhmnXx + 4rh3XFbM9ZqMCAwEAAQ ==
 -----结束证书请求-----

将hex-ascii转换为数据:

 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; }