123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- //
- // AESEncrypt.m
- // MQTTLearn
- //
- // Created by RD on 2020/12/16.
- //
- #import "AESEncrypt.h"
- #import <CommonCrypto/CommonCryptor.h>
- #import "GTMBase64.h"
- #import "NSString+convert.h"
- #define g128key @"1234561234567890" //秘钥
- #define g256key @"12345612345678901234561234567890" //秘钥
- #define gIv @"22222222222222222222222222222222" //向量
- @implementation AESEncrypt
- +(NSString *)cbcEncrypt:(NSString *)content key:(NSString *)key
- {
- NSLog(@"加密数据:%@", content);
- if (content != nil && content.length != 0) {
- NSString *result = aesEncryptString(content, key, gIv);
- NSLog(@"cbc加密:%@", result);
- return result;
- }
- return nil;
- }
-
- +(NSString *)ecbEncrypt:(NSString *)content key:(NSString *)key
- {
- NSLog(@"加密数据:%@", content);
- if (content != nil && content.length != 0) {
- NSString *result = aesEncryptString(content, key, nil);
- NSLog(@"ecb加密:%@", result);
- return result;
- }
- return nil;
- }
- +(NSString *)cbcDecrypt:(NSString *)content key:(NSString *)key
- {
- NSLog(@"解密数据:%@", content);
- if (content != nil && content.length != 0) {
- NSString *result = aesDecryptString(content, key, gIv);
- NSLog(@"cbc解密:%@", result);
- return result;
- }
- return nil;
- }
- +(NSString *)ecbDecrypt:(NSString *)content key:(NSString *)key
- {
- NSLog(@"解密数据:%@", content);
- if (content != nil && content.length != 0) {
- NSString *result = aesDecryptString(content, key, nil);
- NSLog(@"ecb解密:%@", result);
- return result;
- }
- return nil;
- }
- NSData * ecbCipherOperation(NSData *contentData, NSData *keyData, CCOperation operation) {
- NSUInteger dataLength = contentData.length;
- void const *contentBytes = contentData.bytes;
- void const *keyBytes = keyData.bytes;
-
- size_t operationSize = dataLength + kCCBlockSizeAES128;
- void *operationBytes = malloc(operationSize);
- if (operationBytes == NULL) {
- return nil;
- }
- size_t actualOutSize = 0;
-
- CCCryptorStatus cryptStatus = CCCrypt(operation,
- kCCAlgorithmAES128,
- 0x0000 | kCCOptionECBMode, // noPadding
- keyBytes,
- kCCKeySizeAES128, // 秘钥长度选择AES128
- NULL,//initVectorBytes,
- contentBytes,
- dataLength,
- operationBytes,
- operationSize,
- &actualOutSize);
-
- if (cryptStatus == kCCSuccess) {
- return [NSData dataWithBytesNoCopy:operationBytes length:actualOutSize];
- }
-
- free(operationBytes);
- operationBytes = NULL;
- return nil;
- }
- NSData * cbcCipherOperation(NSData *contentData, NSData *keyData, NSData *ivData, CCOperation operation) {
- NSUInteger dataLength = contentData.length;
- void const *initVectorBytes = ivData.bytes;
- void const *contentBytes = contentData.bytes;
- void const *keyBytes = keyData.bytes;
-
- size_t operationSize = dataLength + kCCBlockSizeAES128;
- void *operationBytes = malloc(operationSize);
- if (operationBytes == NULL) {
- return nil;
- }
- size_t actualOutSize = 0;
-
- CCCryptorStatus cryptStatus = CCCrypt(operation,
- kCCAlgorithmAES128,
- 0x0000, // noPadding
- keyBytes,
- kCCKeySizeAES128, // 秘钥长度选择AES128
- initVectorBytes,
- contentBytes,
- dataLength,
- operationBytes,
- operationSize,
- &actualOutSize);
-
- if (cryptStatus == kCCSuccess) {
- return [NSData dataWithBytesNoCopy:operationBytes length:actualOutSize];
- }
-
- free(operationBytes);
- operationBytes = NULL;
- return nil;
- }
- // 加密
- NSString * aesEncryptString(NSString *content, NSString *key, NSString *iv) {
-
- // 把内容转成 data
- NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
- NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
- NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding];
-
- // NSData *contentData = [AESEncrypt convertHexStrToData:content];
- // NSData *keyData = [AESEncrypt convertHexStrToData:key];//[key dataUsingEncoding:NSUTF8StringEncoding];
- // NSData *ivData = [AESEncrypt convertHexStrToData:iv];
-
- NSData *encrptedData = aesEncryptData(contentData, keyData, ivData);
-
- // 将加密好的数据转成16进制的字符
- NSString *result;
- result = [AESEncrypt convertDataToHexStr:encrptedData];
-
- return result;
- }
- // 解密
- NSString * aesDecryptString(NSString *content, NSString *key, NSString *iv) {
-
- // 把内容转成 data
-
- // NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
- NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
- NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding];
-
- NSData *contentData = [AESEncrypt convertHexStrToData:content];
-
- NSData *decryptedData = aesDecryptData(contentData, keyData, ivData);
-
- NSString *result;
- result = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
-
- return result;
- }
- NSData * aesEncryptData(NSData *contentData, NSData *keyData, NSData *ivData) {
- if (ivData) {
- return cbcCipherOperation(contentData, keyData, ivData, kCCEncrypt);
- }else{
- return ecbCipherOperation(contentData, keyData, kCCEncrypt);
- }
- }
- NSData * aesDecryptData(NSData *contentData, NSData *keyData, NSData *ivData) {
- if (ivData) {
- return cbcCipherOperation(contentData, keyData, ivData, kCCDecrypt);
- }else{
- return ecbCipherOperation(contentData, keyData, kCCDecrypt);
- }
- }
- // data转十六进制字符串
- + (NSString *)convertDataToHexStr:(NSData *)data {
- if (!data || [data length] == 0) {
- return @"";
- }
- NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
-
- [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
- unsigned char *dataBytes = (unsigned char*)bytes;
- for (NSInteger i = 0; i < byteRange.length; i++) {
- NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
- if ([hexStr length] == 2) {
- [string appendString:hexStr];
- } else {
- [string appendFormat:@"0%@", hexStr];
- }
- }
- }];
-
- return string;
- }
- // 十六进制字符串转data
- + (NSData *)convertHexStrToData:(NSString *)str {
- if (!str || [str length] == 0) {
- return nil;
- }
-
- NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];
- NSRange range;
- if ([str length] % 2 == 0) {
- range = NSMakeRange(0, 2);
- } else {
- range = NSMakeRange(0, 1);
- }
- for (NSInteger i = range.location; i < [str length]; i += 2) {
- unsigned int anInt;
- NSString *hexCharStr = [str substringWithRange:range];
- NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
-
- [scanner scanHexInt:&anInt];
- NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
- [hexData appendData:entity];
-
- range.location += range.length;
- range.length = 2;
- }
-
- return hexData;
- }
- @end
|