您的位置:首页 > 编程语言 > Java开发

iOS客户端、java服务器的通信用RSA加密

2014-03-13 10:45 344 查看
我的cocoachina发帖

http://www.cocoachina.com/bbs/read.php?tid=166990

openssl实现iOS 和 java服务器端的rsa加密解密。

?服务器这边比较简单,openssl生成一对秘钥public.key
private.key 然后private.key进行pkcs8转换,不转换java没法读取,转换后使用java自带api即可读取。

命令如下

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的文件在读取。要注意全部内容都要发送过来,而且换行也要标记,否则不能用。

示例。

-----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];


读取public.key的关键代码

#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); 是不需要的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: