openssl实现iOS 和 java服务器端的rsa加密解密。
服务器这边比较简单,openssl生成一对秘钥public.key private.key 然后private.key进行pkcs8转换,不转换java没法读取,转换后使用java自带api即可读取。
命令如下
iOS 现将openssl加入到工程里面,openssl头文件和libcrypto.a libssl.a
具体可参考OpenSSLRSAWrapper 注意Header Search Paths和 Library Search Paths需要分加入openssl头文件路径和lib路径,参考附件OpenSSLRSAWrapper工程。
服务器将公钥发过来的时候可以选择public.key的文件,这个最简单了,保存文件然后读取就成。
如果想发送public.key文件的内容,那么就在客户端先把内容写入到一个新的public.key的文件在读取。要注意全部内容都要发送过来,而且换行也要标记,否则不能用。
示例。
关键代码
写入到文件的
读取public.key的关键代码
加密、解密的代码,参考附件那个代码吧。
命令如下
1
2
3
4
5
6
7
|
openssl genrsa -out private.key 1024
openssl rsa -
in
private.key -pubout -out public.key
openssl pkcs8 -topk8 -
in
private.key-out pkcs8_private.key -nocrypt
|
iOS 现将openssl加入到工程里面,openssl头文件和libcrypto.a libssl.a
具体可参考OpenSSLRSAWrapper 注意Header Search Paths和 Library Search Paths需要分加入openssl头文件路径和lib路径,参考附件OpenSSLRSAWrapper工程。
服务器将公钥发过来的时候可以选择public.key的文件,这个最简单了,保存文件然后读取就成。
如果想发送public.key文件的内容,那么就在客户端先把内容写入到一个新的public.key的文件在读取。要注意全部内容都要发送过来,而且换行也要标记,否则不能用。
示例。
1
2
3
4
5
6
|
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmy13dRbbn0WzH6L4lz6THSFyo
DZWPNwsAOFXXAL22D1mqQ+lpkSQbaDZJiq1JEjbeBTsMmXmB5aPP5nIUv4RWNynt
0YfBmftUJbfy8kVyjG5T4UQb05BGiOQf5eEFANH/PIsk8DHhd5EbxK3xyE8rgtmq
/sXORob0liGnrnJVZwIDAQAB
-----END PUBLIC KEY-----
|
关键代码
写入到文件的
1
2
3
4
5
6
|
NSString
*publicKeyStr = [
NSString
stringWithFormat:@
"-----BEGIN PUBLIC KEY-----\n%@\n%@\n%@\n%@\n-----END PUBLIC KEY-----"
,
@
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmy13dRbbn0WzH6L4lz6THSFyo"
,
@
"DZWPNwsAOFXXAL22D1mqQ+lpkSQbaDZJiq1JEjbeBTsMmXmB5aPP5nIUv4RWNynt"
,
@
"0YfBmftUJbfy8kVyjG5T4UQb05BGiOQf5eEFANH/PIsk8DHhd5EbxK3xyE8rgtmq"
,
@
"/sXORob0liGnrnJVZwIDAQAB"
];
[publicKeyStr writeToFile:RSAPublickKeyFile atomically:
YES
encoding:
NSASCIIStringEncoding
error:&error];
|
读取public.key的关键代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <openssl/rsa.h>
#include <openssl/pem.h>
- (
void
)importRSAKeys
{
FILE *publicKeyFile;
RSA *_rsa;
publicKeyFile = fopen([RSAPublickKeyFile cStringUsingEncoding:
NSASCIIStringEncoding
],
"rb"
);
if
(
NULL
!= publicKeyFile) {
const
char
*publicKeyFileName = [RSAPublickKeyFile cStringUsingEncoding:
NSASCIIStringEncoding
];
BIO *bpubKey =
NULL
;
bpubKey = BIO_new(BIO_s_file());
BIO_read_filename(bpubKey, publicKeyFileName);
_rsa = PEM_read_bio_RSA_PUBKEY(bpubKey,
NULL
,
NULL
,
NULL
);
//PEM_read_RSAPublicKey(file,NULL, NULL, NULL);
BIO_free_all(bpubKey);
}
}
|
加密、解密的代码,参考附件那个代码吧。
加密代码中那个 RSA_check_key(_rsa); 是不需要的。
OpenSSLRSAWrapper-master.zip (4441 K)