我的cocoachina发帖
http://www.cocoachina.com/bbs/read.php?tid=166990
openssl实现iOS 和 Java服务器端的rsa加密解密。
命令如下
- 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
具体可参考OpenSSLRSAWrapper 注意Header Search Paths和 Library Search Paths需要分加入openssl头文件路径和lib路径,参考附件OpenSSLRSAWrapper工程。
服务器将公钥发过来的时候可以选择public.key的文件,这个最简单了,保存文件然后读取就成。
如果想发送public.key文件的内容,那么就在客户端先把内容写入到一个新的public.key的文件在读取。要注意全部内容都要发送过来,而且换行也要标记,否则不能用。
示例。
- -----BEGIN PUBLIC KEY-----
- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDmy13dRbbn0WzH6L4lz6THSFyo
- DZWPNwsAOFXXAL22D1mqQ+lpkSQbaDZJiq1JEjbeBTsMmXmB5aPP5nIUv4RWNynt
- 0YfBmftUJbfy8kVyjG5T4UQb05BGiOQf5eEFANH/PIsk8DHhd5EbxK3xyE8rgtmq
- /sXORob0liGnrnJVZwIDAQAB
- -----END PUBLIC KEY-----
写入到文件的
- 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];
- #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); 是不需要的。