iOS AES加密解密實現方法

來源:互聯網
上載者:User

標籤:

使用方法 先匯入標頭檔 #import "NSData+AES.h"

//AES測試//用來密鑰NSString *key = @"123456";//用來發送的未經處理資料NSString *secret = @"I Love You";//資料轉碼NSData *plain = [secret dataUsingEncoding:NSUTF8StringEncoding];//用祕密金鑰加密NSData *cipher = [plain AES256EncryptWithKey:key];    //輸出測試NSLog(@"%@",[cipher newStringInBase64FromData]);printf("%s\n", [[cipher description] UTF8String]);//列印出null,這是因為沒有解密NSLog(@"%@", [[NSString alloc] initWithData:cipher encoding:NSUTF8StringEncoding]);    //解密方法plain = [cipher AES256DecryptWithKey:key];printf("%s\n", [[plain description] UTF8String]);NSLog(@"%@", [[NSString alloc] initWithData:plain encoding:NSUTF8StringEncoding]);

 

自建NSData類別 命名AES

NSData+AES.h

#import <Foundation/Foundation.h>@interface NSData (AES)- (NSData *)AES256EncryptWithKey:(NSString *)key;   //加密- (NSData *)AES256DecryptWithKey:(NSString *)key;   //解密- (NSString *)newStringInBase64FromData;            //追加64編碼+ (NSString*)base64encode:(NSString*)str;           //同上64編碼@end

NSData+AES.m

#import "NSData+AES.h"#import <Foundation/Foundation.h>#import <CommonCrypto/CommonCryptor.h>static char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";@implementation NSData (AES)- (NSData *)AES256EncryptWithKey:(NSString *)key {    // ‘key‘ should be 32 bytes for AES256, will be null-padded otherwise    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)        // fetch key data    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];        NSUInteger dataLength = [self length];        //See the doc: For block ciphers, the output size will always be less than or    //equal to the input size plus the size of one block.    //That‘s why we need to add the size of one block here    size_t bufferSize = dataLength + kCCBlockSizeAES128;    void *buffer = malloc(bufferSize);        size_t numBytesEncrypted = 0;    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,                                          keyPtr, kCCKeySizeAES256,                                          NULL /* initialization vector (optional) */,                                          [self bytes], dataLength, /* input */                                          buffer, bufferSize, /* output */                                          &numBytesEncrypted);    if (cryptStatus == kCCSuccess) {        //the returned NSData takes ownership of the buffer and will free it on deallocation        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];    }        free(buffer); //free the buffer;    return nil;}- (NSData *)AES256DecryptWithKey:(NSString *)key {    // ‘key‘ should be 32 bytes for AES256, will be null-padded otherwise    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)        // fetch key data    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];        NSUInteger dataLength = [self length];        //See the doc: For block ciphers, the output size will always be less than or    //equal to the input size plus the size of one block.    //That‘s why we need to add the size of one block here    size_t bufferSize = dataLength + kCCBlockSizeAES128;    void *buffer = malloc(bufferSize);        size_t numBytesDecrypted = 0;    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,                                          keyPtr, kCCKeySizeAES256,                                          NULL /* initialization vector (optional) */,                                          [self bytes], dataLength, /* input */                                          buffer, bufferSize, /* output */                                          &numBytesDecrypted);        if (cryptStatus == kCCSuccess) {        //the returned NSData takes ownership of the buffer and will free it on deallocation        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];    }        free(buffer); //free the buffer;    return nil;}- (NSString *)newStringInBase64FromData            //追加64編碼{    NSMutableString *dest = [[NSMutableString alloc] initWithString:@""];    unsigned char * working = (unsigned char *)[self bytes];    int srcLen = [self length];    for (int i=0; i<srcLen; i += 3) {        for (int nib=0; nib<4; nib++) {            int byt = (nib == 0)?0:nib-1;            int ix = (nib+1)*2;            if (i+byt >= srcLen) break;            unsigned char curr = ((working[i+byt] << (8-ix)) & 0x3F);            if (i+nib < srcLen) curr |= ((working[i+nib] >> ix) & 0x3F);            [dest appendFormat:@"%c", base64[curr]];        }    }    return dest;}+ (NSString*)base64encode:(NSString*)str{    if ([str length] == 0)        return @"";    const char *source = [str UTF8String];    int strlength  = strlen(source);    char *characters = malloc(((strlength + 2) / 3) * 4);    if (characters == NULL)        return nil;    NSUInteger length = 0;    NSUInteger i = 0;    while (i < strlength) {        char buffer[3] = {0,0,0};        short bufferLength = 0;        while (bufferLength < 3 && i < strlength)            buffer[bufferLength++] = source[i++];        characters[length++] = base64[(buffer[0] & 0xFC) >> 2];        characters[length++] = base64[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];        if (bufferLength > 1)            characters[length++] = base64[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];        else characters[length++] = ‘=‘;        if (bufferLength > 2)            characters[length++] = base64[buffer[2] & 0x3F];        else characters[length++] = ‘=‘;    }    NSString *g = [[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSASCIIStringEncoding freeWhenDone:YES];    return g;}@end

 

iOS AES加密解密實現方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.