在运行时,我的 iOS 应用程序接收到一个带有公私 RSA 密钥对的文件,该文件由其他人的 Java 生成:
KeyPairGenerator keygenerator;
keygenerator = KeyPairGenerator.getInstance("RSA");
keygenerator.initialize(4096);
KeyPair keypair = keygenerator.generateKeyPair();
PrivateKey privateKey = keypair.getPrivate().getEncoded();
PublicKey publicKey = keypair.getPublic().getEncoded();
我已经使用这种方法成功读取并使用了公钥,该方法从密钥中删除了一些前导码。
我现在想使用私钥。同样的方法不起作用,我认为序言有所不同。该博客建议它正在导入 PKCS#1 PEM 密钥,但随后说它们是二进制的,所以我认为它们只是指 Base64 编码的 DER 密钥。我还发现我拥有的密钥可能是PKCS#8编码的。
当然我可以使用
openssl pkcs8 -nocrypt -inform der < pk8.der > pvt.pem
在示例私钥上,openssl 不会抱怨。
公钥是 PKCS#1 和私有 PKCS#8 是否有意义?
但如果可能的话,我真的很想使用 CommonCrypto 和安全框架,而不是链接到 OpenSSL 。在 Mac OS 上,libsecurity中有读取 PKCS#8 的函数,但这还没有进入 iOS。老实说,我确实尝试阅读源代码,但我无法弄清楚他们实际剥离密钥的位置。
[TL;DR] 如何使用 CommonCrypto 或某些 C/C++/ObjC 从 DER 私钥中去除版本和算法PKCS#8 字段,并获取明文密钥?