在Java中生成PKCS#1格式的RSA金鑰
當使用Java API生成RSA金鑰對時,公鑰以X.509格式編碼,私鑰以PKCS#8格式編碼.我正在尋找編碼PKCS#1.這可能嗎?我花了大量的時間來完成Java文件,但還沒有找到解決方案.當我使用Java和Bouncy Castle提供商時,結果是一樣的.
以下是程式碼段:
KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA","BC"); keygen.initialize(1024); KeyPair pair = keygen.generateKeyPair(); PrivateKey priv = pair.getPrivate(); PublicKey pub = pair.getPublic(); byte[] privBytes = priv.getEncoded(); byte[] pubBytes = pub.getEncoded();
兩個生成的位元組陣列格式為X.509(public)和PKCS#8(private).
任何幫助將不勝感激.有一些類似的帖子,但沒有一個真的回答我的問題.
謝謝
你會需要BouncyCastle:
import org.bouncycastle.asn1.ASN1Encodable; import org.bouncycastle.asn1.ASN1Primitive; import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; import org.bouncycastle.util.io.pem.PemObject; import org.bouncycastle.util.io.pem.PemWriter;
下面的程式碼片段已被檢查,並發現與Bouncy Castle 1.52一起工作.
私鑰
將私鑰從PKCS8轉換為PKCS1:
PrivateKey priv = pair.getPrivate(); byte[] privBytes = priv.getEncoded(); PrivateKeyInfo pkInfo = PrivateKeyInfo.getInstance(privBytes); ASN1Encodable encodable = pkInfo.parsePrivateKey(); ASN1Primitive primitive = encodable.toASN1Primitive(); byte[] privateKeyPKCS1 = primitive.getEncoded();
將PKCS1中的私鑰轉換為PEM:
PemObject pemObject = new PemObject("RSA PRIVATE KEY", privateKeyPKCS1); StringWriter stringWriter = new StringWriter(); PemWriter pemWriter = new PemWriter(stringWriter); pemWriter.writeObject(pemObject); pemWriter.close(); String pemString = stringWriter.toString();
使用命令列OpenSSL檢查金鑰格式是否符合預期:
openssl rsa -in rsa_private_key.pem -noout -text
公鑰
將公鑰從X.509 SubjectPublicKeyInfo轉換為PKCS1:
PublicKey pub = pair.getPublic(); byte[] pubBytes = pub.getEncoded(); SubjectPublicKeyInfo spkInfo = SubjectPublicKeyInfo.getInstance(pubBytes); ASN1Primitive primitive = spkInfo.parsePublicKey(); byte[] publicKeyPKCS1 = primitive.getEncoded();
將PKCS1中的公鑰轉換為PEM:
PemObject pemObject = new PemObject("RSA PUBLIC KEY", publicKeyPKCS1); StringWriter stringWriter = new StringWriter(); PemWriter pemWriter = new PemWriter(stringWriter); pemWriter.writeObject(pemObject); pemWriter.close(); String pemString = stringWriter.toString();
使用命令列OpenSSL檢查金鑰格式是否符合預期:
openssl rsa -in rsa_public_key.pem -RSAPublicKey_in -noout -text
謝謝
非常感謝以下帖子的作者:
>ofollow,noindex" target="_blank">http://stackoverflow.com/a/8713518/1016580
>http://stackoverflow.com/a/14052651/1016580
>http://stackoverflow.com/a/14068057/1016580
那些帖子包含有用的,雖然有時是過時的資訊(即對於舊版本的BouncyCastle),這有助於我構建這個帖子.
程式碼日誌版權宣告:
翻譯自:http://stackoverflow.com/questions/7611383/generating-rsa-keys-in-pkcs1-format-in-java