Mac下生成RSA密鑰

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)建立證書請求(按照提示輸入信息)指針

openssl req -new -out cert.csr -key private_key.pem

2)自簽署根證書

openssl x509 -req -in cert.csr -out public_key.der -outform der -signkey private_key.pem -days 3650

2.驗證證書。把public_key.der拖到xcode中,若是文件沒有問題的話,那麼就能夠直接在xcode中打開,看到證書的各類信息。

 

也能夠一行搞定!

最簡單快捷的方法,打開Terminal,使用openssl(Mac OS X自帶)生成私鑰和自簽名的x509證書。

openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650

按照命令行的提示輸入內容就好了。

幾個說明:

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;
}
相關文章
相關標籤/搜索