前言
? ?最近公司的項目要使用RSA加密的方式峦萎,需要客戶端本地生成公鑰和私鑰,將公鑰發(fā)送給服務器忆首,服務器使用公鑰進行加密爱榔,把加密的結果返給客戶端,客戶端使用自己生成的秘鑰進行解密糙及,我在網上查閱了大量的資料详幽,但是大多是利用公鑰私鑰文件,或者直接接收RSA公私鑰字符串進行加密解密,沒有生成并轉換成字符串唇聘,這里就介紹一下我是如何實現這個功能的版姑,以后備用。
一迟郎、OpenSSL環(huán)境搭建
詳情請參照:OpenSSL的下載地址;
導入OpenSSL庫的參照地址:導入OpenSSL項目配置地址
二漠酿、生成密鑰字符串
1、頭文件引入
#import<openssl/rsa.h>谎亩、#import<openssl/pem.h>
2炒嘲、生成密鑰對
rsa =RSA_generate_key(1024,0x10001,NULL,NULL)
? ? 在這里需要說明以下,加密長度是1024位匈庭。加密長度是指理論上最大允許”被加密的信息“長度的限制夫凸,也就是明文的長度限制。隨著這個參數的增大(比方說2048)阱持,允許的明文長度也會增加夭拌,但同時也會造成計算復雜度的極速增長。一般推薦的長度就是1024位(128字節(jié))衷咽。
? ?由于我并沒有在框架中找到方法轉換出密鑰字符串鸽扁,所以這里用了個比較笨拙的方法,將公鑰私鑰保存為txt文件镶骗,然后將這個txt文件讀出桶现,讀出后就是需要的字符串了。
3鼎姊、設置路徑:
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
4骡和、提取公鑰字符串:
NSString*pubPath=[documentsPathstringByAppendingPathComponent:@"PubFile.txt"];
FILE* pubWrite =NULL;
pubWrite =fopen([pubPathUTF8String],"wb");
if(pubWrite==NULL){
NSLog(@"ReadFiled.");
else{
PEM_write_RSA_PUBKEY(pubWrite,rsa);
fclose(pubWrite);
}
5、提取私鑰字符串:
NSString*priPath=[documentsPathstringByAppendingPathComponent:@"PriFile.txt"];
FILE*priWtire=NULL;
priWtire=fopen([priPathUTF8String],"wb");
EVP_PKEY*pkey=NULL;
if(priWtire ==NULL){
NSLog(@"ReadFiled.");
}else{
pkey =EVP_PKEY_new();
EVP_PKEY_assign_RSA(pkey, rsa);
PEM_write_PKCS8PrivateKey(priWtire, pkey,NULL,NULL,0,0,NULL);fclose(priWtire);
}
6相寇、對字符串進行處理得到自己想要的字符串: ?
NSString*str=[NSStringstringWithContentsOfFile:pubPathencoding:NSUTF8StringEncodingerror:nil];
str = [strstringByReplacingOccurrencesOfString:@"-----BEGIN
PUBLIC KEY-----"withString:@""];
str = [strstringByReplacingOccurrencesOfString:@"-----END
PUBLIC KEY-----"withString:@""];
str = [strstringByReplacingOccurrencesOfString:@"\n"withString:@""];
? ? ?這篇文章并沒有對原理進行剖析慰于,只是說明了一下使用方法,而且使用方法不是很好唤衫,我想框架中應該也有可以實現的方法婆赠,但是目前還沒有找到,如果有哪位朋友找到了佳励,一定要記得私信告訴我休里,謝謝