Java生成RSA密钥对并转换为PEM - 但OpenSSL函数PEM_read_bio_RSA_PUBKEY返回null

时间:2016-11-29 09:48:28

标签: java openssl rsa

我使用以下代码生成RSA密钥对并将其转换为PEM。但是当我使用OpenSSL函数时,PEM_read_bio_RSA_PUBKEY返回null。

Java代码:

public static RSAKeyPair creatKeyPair(int keySize) throws Exception {
    KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM);
    keyGen.initialize(keySize, new SecureRandom());
    return getRSAKeyPair(keyGen.genKeyPair());
}
private static RSAKeyPair getRSAKeyPair(KeyPair keyPair) throws Exception {
    RSAKeyPair rsaKeyPair = new RSAKeyPair();
    rsaKeyPair.PrivateKey = rsaKeyToPEMFormat(keyPair.getPrivate());
    rsaKeyPair.PublicKey = rsaKeyToPEMFormat(keyPair.getPublic());
    return rsaKeyPair;
}

private  static String rsaKeyToPEMFormat(Key key){
    StringWriter writer = new StringWriter();
    //org.bouncycastle.openssl.PEMWriter  bcprov-ext-jdk16-1.46.jar
    PEMWriter pemWriter = new PEMWriter(writer);
    try {
        pemWriter.writeObject(key);    
        pemWriter.close();
        return writer.toString();
    } catch (IOException e) {
        LogLIB.error(e.getMessage(), e);
    }
    return null;
}

C 代码:

RSA * createRSA(unsigned char * key, int flag) {
    RSA *rsa = NULL;
    BIO *keybio;
    int keylength = strlen(key);
    keybio = **BIO_new_mem_buf(key, -1);** 
    if (keybio == NULL) {
        LOGV( "Failed to create key BIO" );
        return 0;
    }
    if (flag) {
        rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa, NULL, NULL); //return null !!!
    } else {
        rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);
    }
    if (rsa == NULL) {
        LOGV( "Failed to create RSA");
        //printf( "Failed to create RSA" );
    }

    return rsa;
}

我的测试键:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCT9uJpsYJUVbZGwv9mWYJRMnYr
I85SkGm9Wb/3+04xaZxQG2GchjQsLRvAc2ZG/CpTpen1q7E4nQeuNgthwI6/0LnE
lIkn1O2bcBGUGpyiXseGvSeCfbyFiefNkC0xsyW/w5f506nP4ukroWGCDeSKHg5S
PrA6WDXiy6HhQ3W6EQIDAQAB
-----END PUBLIC KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCT9uJpsYJUVbZGwv9mWYJRMnYrI85SkGm9Wb/3+04xaZxQG2Gc
hjQsLRvAc2ZG/CpTpen1q7E4nQeuNgthwI6/0LnElIkn1O2bcBGUGpyiXseGvSeC
fbyFiefNkC0xsyW/w5f506nP4ukroWGCDeSKHg5SPrA6WDXiy6HhQ3W6EQIDAQAB
AoGAdi0OAmqS9DaM4ZFmmOFOkvlhpezwIcNToLbo+u+NMSvve4+S84fAbbQNYTUJ
8BIA4FQ4O03IurW4Z6ykhItdtp9m1MvJ+KeyvWO8O7ehzKeFQwDz2EXCdSMe5Lhy
GZzcwQUFP+HuyhvX0PMUFYwkPeIYevkeQ1b5GGZoZess/RECQQDWnTjNU4n++QcY
dyvdGfeGqE8GR5imtIEF8yrPjqbn9fC97SgoqxqpdSpcCkGaX7Mx6pPznavdiV3U
ehjx+uI9AkEAsH9jcMjzQWeZ65ihLgiJkgg1a2U7KVhXC47oVRh4TTyVhZwVXaD0
pTuAm9HwkYUsB9+obuqHIw2EYsigC2PYZQJBAK0vlqTq4xMktnshv/3edIbvz0WM
BT2RsASzJDr2LO5G440AkkWvPga9i/9WL3Z5/8sqN1aCSCywK03JcdPj1ykCQBPg
tP1d1G+4UFCFZxm9ImlM/V80Dn6wkVUe6jGzSNFCEoDyvEFIQGVflzN1aIerHPNi
ECE1zrR28EMD32qI+zUCQQCUiJ3wzjXWud0nIFPZANlimvm1Wq273TAzMflHdSYf
H5r1pNJ+1xwaHxaifafBNfADfsW0CJQzuuizZ/zlmHSv
-----END RSA PRIVATE KEY-----

0 个答案:

没有答案