iOS客戶端、java服務器的通信用RSA加密

我的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 


?
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); 是不需要的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章