ios 16进制加密 AES 128 ECB PKCS7Padding

来源:互联网 发布:盘锦大数据 编辑:程序博客网 时间:2024/06/05 23:44

1.使用

 NSString *originalStr=@"AES";        //加密      NSString *encryStr = [AES128Util AES128Encrypt:originalStr key:AES_KEY];      //解密      NSString *decryStr = [AES128Util AES128Decrypt:encryStr key:AES_KEY];            NSLog(@"\n加密前:%@\n加密后:%@ \n解密后:%@",originalStr,encryStr,decryStr);

2.具体实现类  .h文件

#import <Foundation/Foundation.h>    @interface AES128Util : NSObject    +(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key;    +(NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString *)key;    @end  

.m 文件

#import "AES128Util.h"  #import <CommonCrypto/CommonCryptor.h>  #import "GTMBase64.h"    @implementation AES128Util    +(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key  {      char keyPtr[kCCKeySizeAES128+1];      memset(keyPtr, 0, sizeof(keyPtr));      [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];            NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];      NSUInteger dataLength = [data length];            size_t bufferSize = dataLength + kCCBlockSizeAES128;      voidvoid *buffer = malloc(bufferSize);      size_t numBytesEncrypted = 0;      CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,                                            kCCAlgorithmAES128,                                            kCCOptionPKCS7Padding|kCCOptionECBMode,                                            keyPtr,                                            kCCBlockSizeAES128,                                            NULL,                                            [data bytes],                                            dataLength,                                            buffer,                                            bufferSize,                                            &numBytesEncrypted);      if (cryptStatus == kCCSuccess) {          NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];          //return [GTMBase64 stringByEncodingData:resultData];          return [self hexStringFromData:resultData];        }      free(buffer);      return nil;  }      +(NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString *)key  {      char keyPtr[kCCKeySizeAES128 + 1];      memset(keyPtr, 0, sizeof(keyPtr));      [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];            //NSData *data = [GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];            NSData *data=[self dataForHexString:encryptText];            NSUInteger dataLength = [data length];      size_t bufferSize = dataLength + kCCBlockSizeAES128;      voidvoid *buffer = malloc(bufferSize);            size_t numBytesCrypted = 0;      CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,                                            kCCAlgorithmAES128,                                            kCCOptionPKCS7Padding|kCCOptionECBMode,                                            keyPtr,                                            kCCBlockSizeAES128,                                            NULL,                                            [data bytes],                                            dataLength,                                            buffer,                                            bufferSize,                                            &numBytesCrypted);      if (cryptStatus == kCCSuccess) {          NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];          return [[[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding] autorelease];      }      free(buffer);      return nil;  }    // 普通字符串转换为十六进  + (NSString *)hexStringFromData:(NSData *)data {      Byte *bytes = (Byte *)[data bytes];      // 下面是Byte 转换为16进制。      NSString *hexStr = @"";      for(int i=0; i<[data length]; i++) {          NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i] & 0xff]; //16进制数          newHexStr = [newHexStr uppercaseString];                    if([newHexStr length] == 1) {              newHexStr = [NSString stringWithFormat:@"0%@",newHexStr];          }                    hexStr = [hexStr stringByAppendingString:newHexStr];                }      return hexStr;  }    //参考:http://blog.csdn.net/linux_zkf/article/details/17124577  //十六进制转Data  + (NSData*)dataForHexString:(NSString*)hexString  {      if (hexString == nil) {                    return nil;      }            const char* ch = [[hexString lowercaseString] cStringUsingEncoding:NSUTF8StringEncoding];      NSMutableData* data = [NSMutableData data];      while (*ch) {          if (*ch == ' ') {              continue;          }          char byte = 0;          if ('0' <= *ch && *ch <= '9') {                            byte = *ch - '0';          }else if ('a' <= *ch && *ch <= 'f') {                            byte = *ch - 'a' + 10;          }else if ('A' <= *ch && *ch <= 'F') {                            byte = *ch - 'A' + 10;                        }                    ch++;                    byte = byte << 4;                    if (*ch) {                            if ('0' <= *ch && *ch <= '9') {                                    byte += *ch - '0';                                } else if ('a' <= *ch && *ch <= 'f') {                                    byte += *ch - 'a' + 10;                                }else if('A' <= *ch && *ch <= 'F'){                                    byte += *ch - 'A' + 10;                                }                            ch++;                        }                    [data appendBytes:&byte length:1];                }            return data;  }  


1 0
原创粉丝点击