在运行时,我的iOS应用程序收到了由其他人的Java生成的公共-私有RSA密钥对的文件:
KeyPairGenerator keygenerator;
keygenerator = KeyPairGenerator.getInstance("RSA");
keygenerator.initialize(4096);
KeyPair keypair = keygenerator.generateKeyPair();
PrivateKey privateKey = keypair.getPrivate().getEncoded();
PublicKey publicKey = keypair.getPublic().getEncoded();
我已经成功读取并使用了公共密钥,使用this method方法,该方法从密钥中去除了一些前导内容。
现在我想使用私人密钥。相同的方法不起作用,我认为前导内容可能有所不同。该博客建议导入PKCS#1 PEM密钥,但随后又说它们是二进制的,因此我认为他们只是指Base64编码的DER密钥。我还发现,也许我拥有的密钥是PKCS#8编码的。
当然,我可以使用
openssl pkcs8 -nocrypt -inform der < pk8.der > pvt.pem
在一个样本私钥上,OpenSSL没有抱怨。
公钥是PKCS#1,私钥是PKCS#8,这有意义吗?
但我真的想使用CommonCrypto和Security Framework,而不是链接到OpenSSL,如果可能的话。在Mac OS中,libsecurity中有函数可以读取PKCS#8,但这还没有到iOS。老实说,我尝试阅读源代码,但我无法确定他们实际上从哪里剥离密钥。
[TL;DR] 我如何使用CommonCrypto或一些C/C++/ObjC剥离DER私钥的版本和算法PKCS#8字段,只获取纯净的密钥?
infile
应该是指向密钥文件的路径(作为NSString),而不是文件的内容。在你的版本中,将BIO *in
开始的行上的infile
替换为path
,并删除它上面的所有代码(除了导入),保留你的NSString *path = [[NSBundle mainBundle] pathForResource:@"keyNew" ofType:@"pem"];
。 - Cathyopenssl x509 -in cert.crt -outform der -out cert.der
。然后只需按照我上面说的做:将以“BIO *in…”开头的行中的“infile”替换为包含指向密钥文件路径(而不是内容!)的NSString。例如:NSString *path = [[NSBundle mainBundle] pathForResource:@"keyNew" ofType:@"der"];
- CathyBIO *in = BIO_new_file([[[NSBundle mainBundle] pathForResource:@"keyNew" ofType:@"der"] cStringUsingEncoding:NSUTF8StringEncoding], "rb");
并且删除NSString *infile = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
这一行代码,它是用来打开和读取文件的。 - Cathy