从模数和指数生成 RSA 公钥

Posted

技术标签:

【中文标题】从模数和指数生成 RSA 公钥【英文标题】:Generate RSA Public Key from Modulus and Exponent 【发布时间】:2015-06-22 13:44:44 【问题描述】:

我希望从 Objective-C 中的模数和指数生成一个 rsa 公钥 (pem)。这个功能可以通过以下方式在Java中完成;

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

虽然我在为 ios 平台编写此内容时遇到了一些麻烦。我知道 OpenSSL,但我找不到成功的方法,仍然无法生成此密钥。还查看了 SCZ-BasicEncodingRules-iOS 但这会返回一个 NSData 值,我一直在试图弄清楚如何尝试将其转换为 NSString。

【问题讨论】:

1.不是所有的NSData都可以转换成NSString(或者一般情况下不是所有的8位字节都可以转换成unicode字符。2.请提供测试模数和指数,分别是什么格式,hex,Base62,其他? 我通常不会使用“不清楚你在问什么”来投票,但这个属于这一类。究竟是什么问题?你不能在 iOS 上运行 Java?或者您不能将NSData 转换为NSString?此外,RSA 公钥 模数和公共指数,因此它甚至不清楚您要做什么。 请使用这个参考中的这个 C# 类:enter link description here 【参考方案1】:

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

测试数据和代码,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);

带有测试数据的输出:

伯数据: 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 佩姆: -----开始证书请求----- 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;

【讨论】:

请问您在数组中使用了哪些测试数据?更具体地说,在这种情况下从字符串到 nsdata 的正确格式。 这很好,但是您知道将 Array 转换为 PEM 格式的简单方法,该方法可以在纯 Swift 项目中工作(无需桥接到 Objective-C)吗?谢谢 我已经尝试在 swift 中做同样的事情,但它输出错误的密钥大小。你能检查一下这个问题吗? ***.com/questions/43637323/… berData 函数定义? 任何快速转换?

以上是关于从模数和指数生成 RSA 公钥的主要内容,如果未能解决你的问题,请参考以下文章

如何验证 Apple 登录的 Jwt 令牌(后端验证)。如何从 Java 中的模数和指数 (n,e) 生成 RSA 公钥

使用Python从公钥获取RSA指数和模数

RSA:在给定公钥的情况下获取指数和模数

Java中的RSA加密/解密

.net 中 RSA 公钥模数和指数的格式是啥?

生成具有预定义模数和指数的公钥