iOS开发之Objective-c的AES加密和解密算法的实现


高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法。 以下实现代码中分别为NSData和NSString增加了一个Category。使用时直接调用即可。 

需要注意的是,AES并不能作为HASH算法,加密并解密后的结果,并不一定与原文相同,使用时请注意进行结果验算。例如解密原文的长度,格式规则等。 NG实例 

原文:170987350
密码:170

Objective-c的AES加密和解密算法的具体实现代码如下: 1.拓展NSData,增加AES256加密方法 

 
//
//NSData+AES256.h // #import <Foundation/Foundation.h> #import <CommonCrypto/CommonDigest.h> #import <CommonCrypto/CommonCryptor.h> @interface NSData(AES256) -(NSData *) aes256_encrypt:(NSString *)key; -(NSData *) aes256_decrypt:(NSString *)key; @end // //NSData+AES256.m // #import "NSData+AES256.h" @implementation NSData(AES256) - (NSData *)aes256_encrypt:(NSString *)key //加密 {  char keyPtr[kCCKeySizeAES256+1];  bzero(keyPtr, sizeof(keyPtr));  [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  NSUInteger dataLength = [self length];  size_t bufferSize = dataLength + kCCBlockSizeAES128;  void *buffer = malloc(bufferSize);  size_t numBytesEncrypted = 0;  CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,           kCCOptionPKCS7Padding | kCCOptionECBMode,           keyPtr, kCCBlockSizeAES128,           NULL,           [self bytes], dataLength,           buffer, bufferSize,           &numBytesEncrypted);  if (cryptStatus == kCCSuccess) {   return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];  }  free(buffer);  return nil; } - (NSData *)aes256_decrypt:(NSString *)key //解密 {  char keyPtr[kCCKeySizeAES256+1];  bzero(keyPtr, sizeof(keyPtr));  [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  NSUInteger dataLength = [self length];  size_t bufferSize = dataLength + kCCBlockSizeAES128;  void *buffer = malloc(bufferSize);  size_t numBytesDecrypted = 0;  CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,           kCCOptionPKCS7Padding | kCCOptionECBMode,           keyPtr, kCCBlockSizeAES128,           NULL,           [self bytes], dataLength,           buffer, bufferSize,           &numBytesDecrypted);  if (cryptStatus == kCCSuccess) {   return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];  }  free(buffer);  return nil; } @end

2.拓展NSString,增加AES256加密方法,需要导入NSData+AES256.h

 
 
//
//NSString +AES256.h // #import <Foundation/Foundation.h> #import <CommonCrypto/CommonDigest.h> #import <CommonCrypto/CommonCryptor.h> #import "NSData+AES256.h" @interface NSString(AES256) -(NSString *) aes256_encrypt:(NSString *)key; -(NSString *) aes256_decrypt:(NSString *)key; @end // //NSString +AES256.h // @implementation NSString(AES256) -(NSString *) aes256_encrypt:(NSString *)key {  const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];  NSData *data = [NSData dataWithBytes:cstr length:self.length];  //对数据进行加密  NSData *result = [data aes256_encrypt:key];  //转换为2进制字符串  if (result && result.length > 0) {   Byte *datas = (Byte*)[result bytes];   NSMutableString *output = [NSMutableString stringWithCapacity:result.length * 2];   for(int i = 0; i < result.length; i++){    [output appendFormat:@"%02x", datas[i]];   }   return output;  }  return nil; } -(NSString *) aes256_decrypt:(NSString *)key {  //转换为2进制Data  NSMutableData *data = [NSMutableData dataWithCapacity:self.length / 2];  unsigned char whole_byte;  char byte_chars[3] = {'\0','\0','\0'};  int i;  for (i=0; i < [self length] / 2; i++) {   byte_chars[0] = [self characterAtIndex:i*2];   byte_chars[1] = [self characterAtIndex:i*2+1];   whole_byte = strtol(byte_chars, NULL, 16);   [data appendBytes:&whole_byte length:1];  }  //对数据进行解密  NSData* result = [data aes256_decrypt:key];  if (result && result.length > 0) {   return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]autorelease];  }  return nil; } @end
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM