我有一个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。但是,如果有办法,我宁愿不在我的项目中加入海绵城堡。
答案 0 :(得分:0)
你很幸运;看起来你只需要对公钥进行PEM编码,因为Java和OpenSSL都使用与X5.09证书相同的SubjectPublicKey
结构。您可以通过运行RSAPublicKey.encode()
来实现此目的。
不幸的是我不知道任何其他执行PEM编码的库,但我确信如果需要,你可以从Bouncy或Spongy中删除代码; Bouncy Castle图书馆拥有非常宽松的许可结构。