RSA加密(4.0)

前面的文章講了如何創建openssl通用靜態庫

下面講如何使用其靜態庫,首先在你的工程中導入靜態庫

大家主要是看下面的代碼即可

#import <Foundation/Foundation.h>

#include <openssl/rsa.h>

#include <openssl/pem.h>

#include <openssl/err.h>

#include <openssl/des.h>

typedef enum {

    KeyTypePublic,

    KeyTypePrivate

}KeyType;


typedef enum {

    RSA_PADDING_TYPE_NONE       = RSA_NO_PADDING,

    RSA_PADDING_TYPE_PKCS1      = RSA_PKCS1_PADDING,

    RSA_PADDING_TYPE_SSLV23     = RSA_SSLV23_PADDING

}RSA_PADDING_TYPE;

@interface CRSA : NSObject{

    RSA *_rsa;

}

+ (id)shareInstance;

- (BOOL)importRSAKeyWithType:(KeyType)type;

- (int)getBlockSizeWithRSA_PADDING_TYPE:(RSA_PADDING_TYPE)padding_type;

- (NSString *) encryptByRsa:(NSString*)content withKeyType:(KeyType)keyType;

- (NSString *) decryptByRsa:(NSString*)content withKeyType:(KeyType)keyType;

@end



#import "CRSA.h"

#import <CommonCrypto/CommonCrypto.h>

#import "GTMBase64.h"

#define BUFFSIZE  1024


#define PADDING RSA_PADDING_TYPE_PKCS1

@implementation CRSA

+ (id)shareInstance

{

    static CRSA *_crsa = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _crsa = [[CRSA alloc] init];

    });

    return _crsa;

}

- (BOOL)importRSAKeyWithType:(KeyType)type

{

    FILE *file;

    NSString *keyName = type == KeyTypePublic ? @"public_key" : @"private_key";

    NSString *keyPath = [[NSBundle mainBundle] pathForResource:keyName ofType:@"pem"];

    

    file = fopen([keyPath UTF8String], "rb");

    

    if (NULL != file)

    {

        if (type == KeyTypePublic)

        {

            _rsa = PEM_read_RSA_PUBKEY(file, NULL, NULL, NULL);

            assert(_rsa != NULL);

        }

        else

        {

            _rsa = PEM_read_RSAPrivateKey(file, NULL, NULL, NULL);

            assert(_rsa != NULL);

        }

        

        fclose(file);

        

        return (_rsa != NULL) ? YES : NO;

    }

    

    return NO;

}


- (NSString *) encryptByRsa:(NSString*)content withKeyType:(KeyType)keyType

{

    NSString *_content = [content stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    if (![self importRSAKeyWithType:keyType])

        return nil;

    

    int status;

    int length  = [_content length];

    unsigned char input[length + 1];

    bzero(input, length + 1);

    int i = 0;

    for (; i < length; i++)

    {

        input[i] = [_content characterAtIndex:i];

    }

    

    NSInteger  flen = [self getBlockSizeWithRSA_PADDING_TYPE:PADDING];

    

    char*encData = (char*)malloc(flen);

    bzero(encData, flen);

    

    switch (keyType) {

        case KeyTypePublic:

            status = RSA_public_encrypt(length, (unsigned char*)input, (unsigned char*)encData, _rsa, PADDING);

            break;

            

        default:

            status = RSA_private_encrypt(length, (unsigned char*)input, (unsigned char*)encData, _rsa, PADDING);

            break;

    }

    

    if (status)

    {

        NSData *returnData = [NSData dataWithBytes:encData length:status];

        free(encData);

        encData = NULL;

        

        NSString *ret = [GTMBase64 encodeBase64Data:returnData];

        return ret;

    }

    

    free(encData);

    encData = NULL;

    

    return nil;

}


- (NSString *) decryptByRsa:(NSString*)content withKeyType:(KeyType)keyType

{

    if (![self importRSAKeyWithType:keyType])

        return nil;

    

    int status;

    NSData *data = [GTMBase64 decodeString:content];

    int length = [data length];

    

    NSInteger flen = [self getBlockSizeWithRSA_PADDING_TYPE:PADDING];

    char *decData = (char*)malloc(flen);

    bzero(decData, flen);

    

    switch (keyType) {

        case KeyTypePublic:

            status = RSA_public_decrypt(length, (unsigned char*)[data bytes], (unsigned char*)decData, _rsa, PADDING);

            break;

            

        default:

            status = RSA_private_decrypt(length, (unsigned char*)[data bytes], (unsigned char*)decData, _rsa, PADDING);

            break;

    }

    

    if (status)

    {

        NSMutableString *decryptString = [[NSMutableString alloc] initWithBytes:decData length:strlen(decData) encoding:NSASCIIStringEncoding];

        free(decData);

        decData = NULL;

        NSString *_decryptString = [decryptString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

        return _decryptString;

    }

    

    free(decData);

    decData = NULL;

    

    return nil;

}


- (int)getBlockSizeWithRSA_PADDING_TYPE:(RSA_PADDING_TYPE)padding_type

{

    int len = RSA_size(_rsa);

    

    if (padding_type == RSA_PADDING_TYPE_PKCS1 || padding_type == RSA_PADDING_TYPE_SSLV23) {

        len -= 11;

    }

    

    return len;

}

@end


PS:openssl其實是個功能超級強大的靜態庫,適用於很多加密,具體參看其頭文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章