MAC OS自帶了OpenSSL,直接在命令行裏使用OPENSSL就能夠。xcode
打開命令行工具,而後輸入 openssl打開openssl,接着只要三句命令就能夠搞定。安全
第一句命令生成1024位私鑰;app
OpenSSL> genrsa -out rsa_private_key.pem 1024工具
第二句命令把RSA私鑰轉換成PKCS8格式,密碼爲空就行;ui
pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM –nocrypt加密
第三句命令生成公鑰。lua
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pemspa
iOS上並無直接的RSA加密API。可是iOS提供了x509的API,而x509是支持RSA加密的。所以,咱們能夠經過製做自簽名的x509證書(因爲對安全性要求不高,咱們並不須要使用CA認證的證書),再調用x509的相關API來進行加密。命令行
1)建立證書請求(按照提示輸入信息)指針
2)自簽署根證書
2.驗證證書。把public_key.der拖到xcode中,若是文件沒有問題的話,那麼就能夠直接在xcode中打開,看到證書的各類信息。
也能夠一行搞定!
最簡單快捷的方法,打開Terminal,使用openssl(Mac OS X自帶)生成私鑰和自簽名的x509證書。
按照命令行的提示輸入內容就好了。
幾個說明:
public_key.der是輸出的自簽名的x509證書,即咱們要用的。
private_key.pem是輸出的私鑰,用來解密的,請妥善保管。
rsa:1024這裏的1024是密鑰長度,1024是比較安全的,若是須要更安全的話,能夠用2048,可是加解密代價也會增長。
-days:證書過時時間,必定要加上這個參數,默認的證書過時時間是30天,通常咱們不但願證書這麼短就過時,因此寫上比較合適的天數,例如這裏的3650(10年)。
第二步,使用public_key.der來進行加密。
1.導入Security.framework。
2.把public_key.der放到mainBundle中(通常直接拖到Xcode就行啦)。
3.從public_key.der讀取公鑰。
4.加密。
下面是參考代碼(只能用於加密長度小於等於116字節的內容,適合於對密碼進行加密。使用了ARC,不過仍是要注意部分資源須要使用CFRealse來釋放)
+ (SecKeyRef) getPublicKey{ // 從公鑰證書文件中獲取到公鑰的SecKeyRef指針 /* Open and parse the cert*/ NSString *path = [[NSBundle mainBundle] pathForResource:@"public_key" ofType:@"der"]; NSData*certData =[NSData dataWithContentsOfFile:path]; SecCertificateRef cert =SecCertificateCreateWithData(kCFAllocatorDefault,(CFDataRef)certData); SecPolicyRef policy =SecPolicyCreateBasicX509(); SecTrustRef trust; OSStatus status =SecTrustCreateWithCertificates(cert, policy,&trust); /* You can ignore the SecTrustResultType, but you have to run SecTrustEvaluate * before you can get the public key */ SecTrustResultType trustResult; if(status == noErr) { status =SecTrustEvaluate(trust,&trustResult); } /* Now grab the public key from the cert */ SecKeyRef publicKey =SecTrustCopyPublicKey(trust); /* Free the Security Framework! */ CFRelease(cert); CFRelease(policy); CFRelease(trust); return publicKey; } + (NSMutableData*) rsaEncryptString:(NSString*) string{ SecKeyRef key = [self getPublicKey]; size_t cipherBufferSize = SecKeyGetBlockSize(key); uint8_t *cipherBuffer = malloc(cipherBufferSize * sizeof(uint8_t)); NSData *stringBytes = [string dataUsingEncoding:NSUTF8StringEncoding]; size_t blockSize = cipherBufferSize - 11; size_t blockCount = (size_t)ceil([stringBytes length] / (double)blockSize); NSMutableData *encryptedData = [[[NSMutableData alloc] init] autorelease]; for (int i=0; i<blockCount; i++) { int bufferSize = MIN(blockSize,[stringBytes length] - i * blockSize); NSData *buffer = [stringBytes subdataWithRange:NSMakeRange(i * blockSize, bufferSize)]; OSStatus status = SecKeyEncrypt(key, kSecPaddingPKCS1, (const uint8_t *)[buffer bytes], [buffer length], cipherBuffer, &cipherBufferSize); if (status == noErr){ NSData *encryptedBytes = [[NSData alloc] initWithBytes:(const void *)cipherBuffer length:cipherBufferSize]; [encryptedData appendData:encryptedBytes]; [encryptedBytes release]; }else{ if (cipherBuffer) free(cipherBuffer); return nil; } } if (cipherBuffer) free(cipherBuffer); //release key CFRelease(key); // NSLog(@"Encrypted text (%d bytes): %@", [encryptedData length], [encryptedData description]); // NSLog(@"Encrypted text base64: %@", [Base64 encode:encryptedData]); return encryptedData; }