123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- //
- // 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<gbkStr.length/2;i++){
-
- tmp = [gbkStr substringWithRange:NSMakeRange(i*2,2)];
- unsigned int iStr = 0;
- hexScanner = [NSScanner scannerWithString:tmp];
- [hexScanner scanHexInt:&iStr];
- byte[i]=iStr;
- }
-
- NSData *data = [NSData dataWithBytes:byte length:gbkStr.length/2];
- NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
- NSString *retStr = [[NSString alloc] initWithData:data encoding:enc];
-
- return retStr;
- }
- @end
|