実行時に、私の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();
この方法を使用して、公開鍵を正常に読み取り、使用しました。この方法では、鍵から一部のプリアンブルが削除されます。
秘密鍵を使いたいのですが。同じ方法ではうまくいきません。前文がどういうわけか違うと思いました。ブログでは、PKCS#1 PEMキーをインポートしていると示唆されていましたが、バイナリであると記載されているため、Base64でエンコードされたDERキーを意味していると思います。また、私が持っているキーは、代わりにPKCS#8でエンコードされている可能性があることもわかりました。
確かに使える
openssl pkcs8 -nocrypt -inform der < pk8.der > pvt.pem
サンプルの秘密鍵とopensslは文句を言いません。
公開鍵がPKCS#1と秘密鍵がPKCS#8であったことは理にかなっていますか?
ただし、可能であれば、OpenSSLに対してリンクするのではなく、CommonCryptoとSecurityFrameworkを使用したいと思います。Mac OSでは、libsecurityにPKCS#8を読み取る関数がありますが、これはまだiOSに到達していません。正直なところ、ソースを読んでみましたが、実際にどこでキーが削除されているのかわかりません。
[TL; DR] DER秘密鍵からバージョンとアルゴリズムのPKCS#8フィールドを削除し、CommonCryptoまたはC / C ++ / ObjCを使用してプレーンキーを取得するにはどうすればよいですか?