BouncyCastle 公钥,密钥转换


  
  

You will need 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;

The code snippets below have been checked and found working with Bouncy Castle 1.52.

Private key

Convert private key from PKCS8 to 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();

Convert private key in PKCS1 to 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();

Check with command line OpenSSL that the key format is as expected:

openssl rsa -in rsa_private_key.pem -noout -text

Public key

Convert public key from X.509 SubjectPublicKeyInfo to PKCS1:

PublicKey pub = pair.getPublic();
byte[] pubBytes = pub.getEncoded();

SubjectPublicKeyInfo spkInfo = SubjectPublicKeyInfo.getInstance(pubBytes);
ASN1Primitive primitive = spkInfo.parsePublicKey();
byte[] publicKeyPKCS1 = primitive.getEncoded();

Convert public key in PKCS1 to 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();

Check with command line OpenSSL that the key format is as expected:

openssl rsa -in rsa_public_key.pem -RSAPublicKey_in -noout -text

Thanks

Many thanks to the authors of the following posts:

Those posts contained useful, though sometimes outdated info (i.e. for older versions of BouncyCastle), that helped me to construct this post.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要生成SM2公钥PEM文件,需要使用Java的Bouncy Castle库。下面是一个示例代码,可以生成SM2公钥PEM文件: ```java import java.io.FileWriter; java.io.IOException; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.Security; import org.bouncycastle.asn1.x500.X500Name; import org.bouncycastle.cert.X509v3CertificateBuilder; import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter; import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder; import org.bouncycastle.crypto.generators.ECKeyPairGenerator; import org.bouncycastle.crypto.params.ECKeyGenerationParameters; import org.bouncycastle.crypto.params.ECPrivateKeyParameters; import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.crypto.util.PrivateKeyFactory; import org.bouncycastle.crypto.util.SubjectPublicKeyInfoFactory; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; public class SM2KeyPairGenerator { static { Security.addProvider(new BouncyCastleProvider()); } public static void main(String[] args) throws Exception { // Generate SM2 key pair KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC"); ECKeyGenerationParameters ecParams = new ECKeyGenerationParameters(SM2Curve.SM2P256V1_DOMAIN_PARAMS, null); ECKeyPairGenerator keyPairGen = new ECKeyPairGenerator(); keyPairGen.init(ecParams); keyPairGenerator.initialize(ecParams); KeyPair keyPair = keyPairGenerator.generateKeyPair(); ECPublicKeyParameters publicKey = (ECPublicKeyParameters) keyPair.getPublic(); ECPrivateKeyParameters privateKey = (ECPrivateKeyParameters) keyPair.getPrivate(); // Output public key in PEM format String pemFileName = "public_key.pem"; FileWriter pemFileWriter = new FileWriter(pemFileName); pemFileWriter.write("-----BEGIN PUBLIC KEY-----\n"); byte[] publicKeyBytes = SubjectPublicKeyInfoFactory.createSubjectPublicKeyInfo(publicKey).getEncoded(); pemFileWriter.write(new String(Hex.encode(publicKeyBytes)).toUpperCase()); pemFileWriter.write("\n-----END PUBLIC KEY-----\n"); pemFileWriter.close(); System.out.println("Public key generated: " + pemFileName); } } ``` 在上面的代码中,我们首先生成了一个SM2密钥对,然后将公钥转换PEM格式并将其写入文件。这里我们使用了Bouncy Castle库提供的SubjectPublicKeyInfoFactory类来将ECPublicKeyParameters对象转换为SubjectPublicKeyInfo对象,然后将其编码为DER格式,最后将DER格式的公钥用Hex编码并写入PEM文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值