// // EncryptionTools.m // #import "EncryptionTools.h" @interface EncryptionTools() @property (nonatomic, assign) int keySize; @property (nonatomic, assign) int blockSize; @end @implementation EncryptionTools + (instancetype)sharedEncryptionTools { static EncryptionTools *instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; instance.algorithm = kCCAlgorithmAES; }); return instance; } - (void)setAlgorithm:(uint32_t)algorithm { _algorithm = algorithm; switch (algorithm) { case kCCAlgorithmAES: self.keySize = kCCKeySizeAES128; self.blockSize = kCCBlockSizeAES128; break; case kCCAlgorithmDES: self.keySize = kCCKeySizeDES; self.blockSize = kCCBlockSizeDES; break; default: break; } } - (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv { if (string == nil) { return nil; } // 设置秘钥 NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding]; uint8_t cKey[self.keySize]; bzero(cKey, sizeof(cKey)); [keyData getBytes:cKey length:self.keySize]; // 设置iv uint8_t cIv[self.blockSize]; bzero(cIv, self.blockSize); int option = 0; /** kCCOptionPKCS7Padding CBC 的加密 kCCOptionPKCS7Padding | kCCOptionECBMode ECB 的加密 */ if (iv) { [iv getBytes:cIv length:self.blockSize]; option = kCCOptionPKCS7Padding; } else { option = kCCOptionPKCS7Padding | kCCOptionECBMode; } // 设置输出缓冲区 NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; size_t bufferSize = [data length] + self.blockSize; void *buffer = malloc(bufferSize); // 开始加密 size_t encryptedSize = 0; /* CCCrypt 对称加密算法的核心函数(加密/解密) 第一个参数:kCCEncrypt 加密/ kCCDecrypt 解密 第二个参数:加密算法,默认使用的是 AES/DES 第三个参数:加密选项 ECB/CBC kCCOptionPKCS7Padding CBC 的加密 kCCOptionPKCS7Padding | kCCOptionECBMode ECB 的加密 第四个参数:加密密钥 第五个参数:密钥的长度 第六个参数:初始向量 第七个参数:加密的数据 第八个参数:加密的数据长度 第九个参数:密文的内存地址 第十个参数:密文缓冲区的大小 第十一个参数:加密结果的大小 */ CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, self.algorithm, option, cKey, self.keySize, cIv, [data bytes], [data length], buffer, bufferSize, &encryptedSize); NSData *result = nil; if (cryptStatus == kCCSuccess) { result = [NSData dataWithBytesNoCopy:buffer length:encryptedSize]; } else { free(buffer); NSLog(@"[错误] 加密失败|状态编码: %d", cryptStatus); } return [result base64EncodedStringWithOptions:0]; } - (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv { if (string == nil) { return nil; } // 设置秘钥 NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding]; uint8_t cKey[self.keySize]; bzero(cKey, sizeof(cKey)); [keyData getBytes:cKey length:self.keySize]; // 设置iv uint8_t cIv[self.blockSize]; bzero(cIv, self.blockSize); int option = 0; if (iv) { [iv getBytes:cIv length:self.blockSize]; option = kCCOptionPKCS7Padding; } else { option = kCCOptionPKCS7Padding | kCCOptionECBMode; } // 设置输出缓冲区 NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0]; size_t bufferSize = [data length] + self.blockSize; void *buffer = malloc(bufferSize); // 开始解密 size_t decryptedSize = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, self.algorithm, option, cKey, self.keySize, cIv, [data bytes], [data length], buffer, bufferSize, &decryptedSize); NSData *result = nil; if (cryptStatus == kCCSuccess) { result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize]; } else { free(buffer); NSLog(@"[错误] 解密失败|状态编码: %d", cryptStatus); } return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]; } + (NSString *)getStringFromGBKStr:(NSString *)gbkStr { gbkStr = [gbkStr stringByReplacingOccurrencesOfString:@"0000"withString:@""]; Byte byte[gbkStr.length/2]; NSScanner *hexScanner; NSString *tmp; for(NSUInteger i=0;i