2013-04-18 50 views
4

我正尝试使用OpenSSL为应用程序添加RSA加密,但我无法获取要加载的证书。在我的应用程序中,公钥证书将从服务器分发,我需要使用该密钥并使用它来解密我的应用将扫描的加密条码中的内容。Objective-C with OpenSSL - 无法设置RSA密钥

我在安全库上选择OpenSSL的原因是我还需要ECDSA验证,目前本地不支持该验证。

我已经尝试了很多方法来获取加载密钥。 OpenSSL PEM_read_RSA_PUBKEY方法需要一个文件指针。但是,当我运行下面的代码时,只要我尝试访问密钥,就会崩溃EXC_BAD_ACCESS

NSString * path = [[NSBundle mainBundle] pathForResource: @"public" ofType: @"pem"]; 
FILE *f = fopen([path cStringUsingEncoding:1],"r"); 
if (f == NULL) 
    NSLog(@"%@", [path stringByAppendingString:@" not found"]); 

RSA *rsa = PEM_read_RSA_PUBKEY(f,NULL,NULL,NULL); 

fclose(f); 

NSLog (@"%d KeyCheck", RSA_check_key(rsa)); 

我从OpenSSL库中包含下列头

#include <openssl/opensslv.h> 
#include <openssl/crypto.h> 
#include <openssl/rsa.h> 
#include <openssl/pem.h> 

我有其他OpenSSL的方法,如MD5,Base64编码/解码,SHA1和ECDSA代码工作正常,它只是路过在RSA证书,让我难住!

的public.pem密钥文件包含此项:

-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+ynZ7EvJ0F+IoGmlme/j/MpH4 
7BxrIuDTJCOS99j82IL3Ww9Ubm28yOMHYPdi23WPDhR80ugaBWAnmqUZWvYKjqd4 
Z4D0sJ0NVW3DDgZ4gS57zFqlvGgdVhzaVimfs7qDxIJ1o8GMuXWseZV2ZpmIjdnF 
ZBol5zZTqNfk89RNnQIDAQAB 
-----END PUBLIC KEY----- 
+0

你的文件必须由启动----- BEGIN RSA公钥---- – doptimusprime 2013-04-18 06:30:36

+0

不知道,这是因为在命令行'OpenSSL的rsautl -verify -in加密的问题退房手续解密-inkey public.pem -pubin'在这个键上工作得很好。 – PassKit 2013-04-18 08:07:52

+0

只是一个愚蠢的问题:你是否验证过'path','f'和'rsa'不是NULL? - 注意,* proper *方法是'FILE * f = fopen([path fileSystemRepresentation],“r”)'而不是魔术编码数字'1'。 – 2013-04-18 08:39:09

回答

1

程序读取RSA公钥是罚款。

问题是

RSA_check_key 

请阅读有关RSA_check_key here

它不适用于公钥。您需要此功能的私钥。 这就是为什么它崩溃,因为它有它的私钥。 由于之前的答案而造成的不便,敬请谅解。

http://www.openssl.org/docs/crypto/RSA_check_key.html

+0

我已经改变了RSA密钥并尝试了'BIO * buffer = BIO_new_file([path cStringUsingEncoding:NSUTF8StringEncoding],“r”); EVP_PKEY * key = PEM_read_bio_PUBKEY(buffer,NULL,NULL,NULL);'但'key'仍然空值。 – PassKit 2013-04-18 08:06:32

+0

是公钥还是公钥证书(X.509)? – doptimusprime 2013-04-18 08:15:11

+0

我编辑了X.509证书。但看到它的DER代表后,它看起来不像证书。但是,你可以尝试它是否有效。 – doptimusprime 2013-04-18 08:47:37