2014-09-24 85 views
1

如何在Objective-C中实现以下命令的效果?从pem格式的私钥中提取公钥

openssl rsa -in mykey.pem -pubout > mykey.pub 

我能够以pem格式生成私钥。

这里是我用来读取私钥到openssl RSA对象的代码。

BIO* bpPrivate = nil; 
NSString *filePath = ..... 
const char *path = [filePath UTF8String]; 
bpPrivate = BIO_new_file(path, "r"); 
_rsa = PEM_read_bio_RSAPrivateKey(bpPrivate, NULL, 0, NULL); 

我想从私钥中提取公钥。

+0

Objective-C的消耗常规的C,所以它可以使用任何东西针对C书写。您不必将自己限制为Objective-C类。事实上,你并没有通过调用OpenSSL的'PEM_read_bio_RSAPrivateKey'来限制自己。 – jww 2014-09-25 02:32:29

回答

0

在记忆中,没有ASN.1,DER,PEM或其他编码的概念。 RSA密钥对于公钥和私钥使用相同的结构。对于公钥,不使用某些字段。如果您对该领域感兴趣,请访问PKCS #1RFC 3447

因此,给定一个RSA*,你所需要做的就是拨打PEM_write_bio_RSAPublicKey(即使使用私钥)。您也可以使用PEM_write_RSAPublicKey(即使使用私钥)。所有读写功能请参见pem(3)

您还可以通过RSAPublicKey_dup完成很长的路。它将采用一个准确的密钥(即,一个RSA*)并返回一个公钥(即,一个RSA*)。但大多数情况下这是不必要的一步。如果你有这个要求,把钥匙放在记忆里可能是有用的。

RSA* privKey = NULL; 
RSA* pubKey = NULL; 
BIGNUM* exp = NULL; 

privKey = RSA_new(); 
ASSERT(privKey != NULL); 

exp = BN_new(); 
ASSERT(exp != NULL); 

rc = BN_set_word(exp, RSA_F4); 
ASSERT(rc == 1); 

rc = RSA_generate_key_ex(privKey, 1024, exp, NULL); 
ASSERT(rc == 1); 

pubKey = RSAPublicKey_dup(privKey); 
ASSERT(pubKey != NULL); 

RSA_print_fp(stdout, pubKey, 0); 

if(pubKey) { 
    RSA_free(pubKey); 
} 

if(privKey) { 
    RSA_free(privKey); 
} 

if(exp) { 
    BN_free(exp); 
} 

RSA_print_fp结果:

$ ./t.exe 
Public-Key: (1024 bit) 
Modulus: 
    00:c3:30:67:d9:11:59:9b:85:7a:1a:95:fa:fd:c0: 
    dd:cd:21:d6:41:6b:16:70:c2:57:9a:f2:d2:bd:3b: 
    c0:02:7b:6a:ab:7f:13:a7:53:2f:31:10:08:3a:62: 
    28:40:5f:82:19:23:f6:0f:78:f5:e3:e4:19:a1:b4: 
    73:65:35:10:db:17:28:41:42:ba:df:8c:18:3b:d8: 
    62:52:65:61:0e:cd:60:28:c9:75:a8:5b:46:a4:89: 
    db:78:89:49:87:5d:7f:ce:d0:44:c4:fd:4a:74:66: 
    d4:46:21:c1:89:97:28:de:43:e9:94:50:f1:36:85: 
    a7:ef:6c:6d:6f:5d:78:00:67 
Exponent: 65537 (0x10001) 

您可以添加一个调用PEM_write_RSAPublicKey

FILE* file = fopen("rsa-pub.pem", "w"); 
ASSERT(file != NULL); 

rc = PEM_write_RSAPublicKey(file, pubKey); 

然后:

$ ./t.exe 
$ cat rsa-pub.pem 
-----BEGIN RSA PUBLIC KEY----- 
MIGJAoGBAMb2jIVcTttHRqG9szv3CFZ742l7LxnVoM6oOfQXNOwabh+GB4Srf4IA 
XRcGan7cj1DShnoPw9fp3IeuAUerk3xz8yPXCw09dLwrFcsmItLVnSLoRtpHnxN5 
30Wd5vKpvKTLIQnurGo05s911ukFJeGo2y2OjSnTiQcJLUdt497tAgMBAAE= 
-----END RSA PUBLIC KEY----- 
+0

谢谢jww,它按照我的预期工作。 RSAPublicKey_dup解决了我的问题。 – yohon 2014-09-25 16:38:12

+0

@yohon我们是否可以用Eliptice Curve“ecdsa-with-SHA256”创建PEM证书 “http://oid-info.com/cgi-bin/display?oid=1.2.840.10045.4.3.2&action=display”? – Aleem 2016-11-24 10:28:01

+0

@ oid-info.com/cgi-bin - 请参阅OpenSSL wiki上的[Elliptic Curve Cryptography](https://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography)。 – jww 2016-11-24 11:45:11