zoukankan      html  css  js  c++  java
  • Generating RSA keys in PKCS#1 format in Java--转

    原文地址:https://stackoverflow.com/questions/7611383/generating-rsa-keys-in-pkcs1-format-in-java

    When I generate an RSA key pair using the Java API, the public key is encoded in the X.509 format and the private key is encoded in the PKCS#8 format. I'm looking to encode both as PKCS#1. Is this possible? I've spent a considerable amount of time going through the Java docs but haven't found a solution. The result is the same when I use the Java and the Bouncy Castle providers.

    Here is a snippet of the code:

    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();

    The two resulting byte arrays are formatted as X.509 (public) and PKCS#8 (private).

    Any help would be much appreciated. There are some similar posts but none really answer my question.

    Thank You

    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.

  • 相关阅读:
    我的第一个博客在博客园安家了,哈哈~欢迎大家光临
    JS未设置对象问题解决方案
    关于Oracle的优化
    USACO 1.2 Milking Cows
    C语言的文件操作 freopen
    USACO 1.2 Palindromic Squares
    USACO 1.1 Broken Necklace
    ACM征程再次起航!
    USACO 1.3 Barn Repair
    USACO 1.2 Transformations
  • 原文地址:https://www.cnblogs.com/davidwang456/p/8807768.html
Copyright © 2011-2022 走看看