iOS開發之Objective-c的AES加密和解密演算法的實現

來源:互聯網
上載者:User

標籤:

原文:http://www.lidaren.com/archives/1470
進階加密標準(Advanced Encryption Standard,AES),又稱Rijndael加密法。 以下實現代碼中分別為NSData和NSString增加了一個Category。使用時直接調用即可。
需要注意的是,AES並不能作為HASH演算法,加密並解密後的結果,並不一定與原文相同,使用時請注意進行結果驗算。例如解密原文的長度,格式規則等。 NG執行個體原文:170987350密碼:170Objective-c的AES加密和解密演算法的具體實現代碼如下: 1.拓展NSData,增加AES256加密方法

 

  1 //  2 //NSData+AES256.h  3 //  4    5 #import <Foundation/Foundation.h>  6 #import <CommonCrypto/CommonDigest.h>  7 #import <CommonCrypto/CommonCryptor.h>  8    9 @interface NSData(AES256) 10 -(NSData *) aes256_encrypt:(NSString *)key; 11 -(NSData *) aes256_decrypt:(NSString *)key; 12 @end 13   14   15 // 16 //NSData+AES256.m 17 // 18 #import "NSData+AES256.h" 19   20 @implementation NSData(AES256) 21   22 - (NSData *)aes256_encrypt:(NSString *)key   //加密 23 { 24   char keyPtr[kCCKeySizeAES256+1]; 25   bzero(keyPtr, sizeof(keyPtr)); 26   [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 27   NSUInteger dataLength = [self length]; 28   size_t bufferSize = dataLength + kCCBlockSizeAES128; 29   void *buffer = malloc(bufferSize); 30   size_t numBytesEncrypted = 0; 31   CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, 32                       kCCOptionPKCS7Padding | kCCOptionECBMode, 33                       keyPtr, kCCBlockSizeAES128, 34                       NULL, 35                       [self bytes], dataLength, 36                       buffer, bufferSize, 37                       &numBytesEncrypted); 38   if (cryptStatus == kCCSuccess) { 39     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 40   } 41   free(buffer); 42   return nil; 43 } 44   45   46 - (NSData *)aes256_decrypt:(NSString *)key   //解密 47 { 48   char keyPtr[kCCKeySizeAES256+1]; 49   bzero(keyPtr, sizeof(keyPtr)); 50   [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 51   NSUInteger dataLength = [self length]; 52   size_t bufferSize = dataLength + kCCBlockSizeAES128; 53   void *buffer = malloc(bufferSize); 54   size_t numBytesDecrypted = 0; 55   CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 56                       kCCOptionPKCS7Padding | kCCOptionECBMode, 57                       keyPtr, kCCBlockSizeAES128, 58                       NULL, 59                       [self bytes], dataLength, 60                       buffer, bufferSize, 61                       &numBytesDecrypted); 62   if (cryptStatus == kCCSuccess) { 63     return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 64   65   } 66   free(buffer); 67   return nil; 68 } 69 @end 70 2.拓展NSString,增加AES256加密方法,需要匯入NSData+AES256.h 71  72   73 // 74 //NSString +AES256.h 75 // 76   77 #import <Foundation/Foundation.h> 78 #import <CommonCrypto/CommonDigest.h> 79 #import <CommonCrypto/CommonCryptor.h> 80   81 #import "NSData+AES256.h" 82   83 @interface NSString(AES256) 84   85 -(NSString *) aes256_encrypt:(NSString *)key; 86 -(NSString *) aes256_decrypt:(NSString *)key; 87   88 @end 89   90   91 // 92 //NSString +AES256.h 93 // 94   95 @implementation NSString(AES256) 96   97 -(NSString *) aes256_encrypt:(NSString *)key 98 { 99   const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];100   NSData *data = [NSData dataWithBytes:cstr length:self.length];101   //對資料進行加密102   NSData *result = [data aes256_encrypt:key];103  104   //轉換為2進位字串105   if (result && result.length > 0) {106  107     Byte *datas = (Byte*)[result bytes];108     NSMutableString *output = [NSMutableString stringWithCapacity:result.length * 2];109     for(int i = 0; i < result.length; i++){110       [output appendFormat:@"%02x", datas[i]];111     }112     return output;113   }114   return nil;115 }116  117 -(NSString *) aes256_decrypt:(NSString *)key118 {   119   //轉換為2進位Data120   NSMutableData *data = [NSMutableData dataWithCapacity:self.length / 2];121   unsigned char whole_byte;122   char byte_chars[3] = {‘\0‘,‘\0‘,‘\0‘};123   int i;124   for (i=0; i < [self length] / 2; i++) {125     byte_chars[0] = [self characterAtIndex:i*2];126     byte_chars[1] = [self characterAtIndex:i*2+1];127     whole_byte = strtol(byte_chars, NULL, 16);128     [data appendBytes:&whole_byte length:1];129   }130  131   //對資料進行解密132   NSData* result = [data aes256_decrypt:key];133   if (result && result.length > 0) {134     return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];135   }136   return nil;137 }138 @end

 

iOS開發之Objective-c的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.