138 lines
3.6 KiB
Objective-C
138 lines
3.6 KiB
Objective-C
|
|
|
|
// Created by YUMI on 2023/2/13.
|
|
|
|
|
|
#import "AESUtils.h"
|
|
#import <CommonCrypto/CommonCrypto.h>
|
|
|
|
#define GL_AES_KEY @"aef01238765abcdeaaageggbeggsded"
|
|
#define GL_AES_IV @"edgcdgrtc"
|
|
@implementation AESUtils
|
|
//MARK: AES加解密相关 start
|
|
+ (NSString *)aesEncrypt:(NSString *)sourceStr {
|
|
if (!sourceStr) {
|
|
return nil;
|
|
}
|
|
|
|
|
|
char keyPtr[kCCKeySizeAES256 + 1];
|
|
bzero(keyPtr, sizeof(keyPtr));
|
|
[GL_AES_KEY getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
|
|
|
|
|
|
char ivPtr[kCCBlockSizeAES128 + 1];
|
|
bzero(ivPtr, sizeof(ivPtr));
|
|
[GL_AES_IV getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
|
|
|
|
NSData *sourceData = [sourceStr dataUsingEncoding:NSUTF8StringEncoding];
|
|
NSUInteger dataLength = [sourceData length];
|
|
size_t buffersize = dataLength + kCCBlockSizeAES128;
|
|
void *buffer = malloc(buffersize);
|
|
size_t numBytesEncrypted = 0;
|
|
|
|
|
|
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
|
|
kCCAlgorithmAES128,
|
|
kCCOptionPKCS7Padding,
|
|
keyPtr,
|
|
kCCBlockSizeAES128,
|
|
ivPtr,
|
|
[sourceData bytes],
|
|
dataLength,
|
|
buffer,
|
|
buffersize,
|
|
&numBytesEncrypted);
|
|
|
|
if (cryptStatus == kCCSuccess) {
|
|
NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
|
|
|
|
|
|
NSMutableString *output = [NSMutableString stringWithCapacity:encryptData.length * 2];
|
|
if (encryptData && encryptData.length > 0) {
|
|
Byte *datas = (Byte*)[encryptData bytes];
|
|
for(int i = 0; i < encryptData.length; i++){
|
|
[output appendFormat:@"%02x", datas[i]];
|
|
}
|
|
}
|
|
return output;
|
|
|
|
} else {
|
|
free(buffer);
|
|
return nil;
|
|
}
|
|
}
|
|
|
|
+ (NSString *)aesDecrypt:(NSString *)secretStr {
|
|
if (!secretStr) {
|
|
return nil;
|
|
}
|
|
|
|
NSData *decodeData = [[NSData alloc] initWithBase64EncodedString:secretStr options:NSDataBase64DecodingIgnoreUnknownCharacters];
|
|
|
|
|
|
char keyPtr[kCCKeySizeAES256 + 1];
|
|
bzero(keyPtr, sizeof(keyPtr));
|
|
[GL_AES_KEY getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
|
|
|
|
|
|
char ivPtr[kCCBlockSizeAES128 + 1];
|
|
bzero(ivPtr, sizeof(ivPtr));
|
|
[GL_AES_IV getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
|
|
|
|
NSUInteger dataLength = [decodeData length];
|
|
size_t bufferSize = dataLength + kCCBlockSizeAES128;
|
|
void *buffer = malloc(bufferSize);
|
|
size_t numBytesDecrypted = 0;
|
|
|
|
|
|
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
|
|
kCCAlgorithmAES128,
|
|
kCCOptionPKCS7Padding,
|
|
keyPtr,
|
|
kCCBlockSizeAES128,
|
|
ivPtr,
|
|
[decodeData bytes],
|
|
dataLength,
|
|
buffer,
|
|
bufferSize,
|
|
&numBytesDecrypted);
|
|
if (cryptStatus == kCCSuccess) {
|
|
NSData *data = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
|
|
NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
|
return result;
|
|
} else {
|
|
free(buffer);
|
|
return nil;
|
|
}
|
|
}
|
|
|
|
|
|
+ (NSData *)convertHexStrToData:(NSString *)str {
|
|
if (!str || [str length] == 0) {
|
|
return nil;
|
|
}
|
|
|
|
NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:20];
|
|
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
|