如何在Android中生成类似于OpenSSL PEM_write_PUBKEY生成的密钥的RSA密钥

时间:2014-06-28 09:43:39

标签: android openssl rsa public-key

我有一个C应用程序,在此应用程序中,我使用以下代码生成一个RSA密钥对(由于可读性而错误检查):

void generateKeyPair(char* pass) {
    EVP_PKEY *pkey = NULL;
    RSA* r;

    OpenSSL_add_all_algorithms();
    RAND_load_file("/dev/urandom", 1024);

    r = RSA_generate_key(KEY_LENGTH, RSA_F4, NULL, NULL);

    pkey = EVP_PKEY_new();
    EVP_PKEY_assign_RSA(pkey, r);

    FILE* fp = fopen("private.key", "w");
    PEM_write_PrivateKey(fp, pkey, EVP_aes_256_cbc(), NULL, 0, NULL, pass);
    fclose(fp);

    fp = fopen("public.key", "w");
    PEM_write_PUBKEY(fp, pkey);
    fclose(fp);
}

我通过设备之间的服务器同步公共PEM密钥。现在我必须编写兼容的Android应用程序,虽然我必须以相同的格式生成公钥,然后是PEM_write_PUBKEY。

我知道我应该用DER格式进行同步,但现在我不能再改变设计了。没有办法以类似的格式生成密钥。

我猜它是#PCKS1 base64编码密钥,但我不确定,我不知道如何在Android中生成类似的--Androids标准是#PCKS8。但是,如果有办法,我宁愿不在我的项目中加入海绵城堡。

1 个答案:

答案 0 :(得分:0)

你很幸运;看起来你只需要对公钥进行PEM编码,因为Java和OpenSSL都使用与X5.09证书相同的SubjectPublicKey结构。您可以通过运行RSAPublicKey.encode()来实现此目的。

不幸的是我不知道任何其他执行PEM编码的库,但我确信如果需要,你可以从Bouncy或Spongy中删除代码; Bouncy Castle图书馆拥有非常宽松的许可结构。