2014-06-28 75 views
0

我有一個C應用程序,該應用程序內我生成RSA密鑰對,用下面的代碼(錯誤檢查左由於可讀性):如何生成Android中生成的RSA密鑰類似於OpenSSL的PEM_write_PUBKEY鍵

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。但是,如果有解決方法,我寧願不要在我的項目中包含海綿城堡。

+0

PKCS#8用於私鑰。 –

回答

0

你很幸運;看起來你只需要PEM編碼你的公鑰,因爲Java和OpenSSL都使用與X5.09證書相同的SubjectPublicKey結構。你可以通過運行RSAPublicKey.encode()來實現。

不幸的是,我不知道任何其他庫執行PEM編碼,但我相信如果需要可以從Bouncy或Spongy中去掉代碼; Bouncy Castle圖書館擁有非常自由的許可證結構。