EncryptionTools.m 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. //
  2. // EncryptionTools.m
  3. //
  4. #import "EncryptionTools.h"
  5. @interface EncryptionTools()
  6. @property (nonatomic, assign) int keySize;
  7. @property (nonatomic, assign) int blockSize;
  8. @end
  9. @implementation EncryptionTools
  10. + (instancetype)sharedEncryptionTools
  11. {
  12. static EncryptionTools *instance;
  13. static dispatch_once_t onceToken;
  14. dispatch_once(&onceToken, ^{
  15. instance = [[self alloc] init];
  16. instance.algorithm = kCCAlgorithmAES;
  17. });
  18. return instance;
  19. }
  20. - (void)setAlgorithm:(uint32_t)algorithm
  21. {
  22. _algorithm = algorithm;
  23. switch (algorithm) {
  24. case kCCAlgorithmAES:
  25. self.keySize = kCCKeySizeAES128;
  26. self.blockSize = kCCBlockSizeAES128;
  27. break;
  28. case kCCAlgorithmDES:
  29. self.keySize = kCCKeySizeDES;
  30. self.blockSize = kCCBlockSizeDES;
  31. break;
  32. default:
  33. break;
  34. }
  35. }
  36. - (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv
  37. {
  38. if (string == nil) {
  39. return nil;
  40. }
  41. // 设置秘钥
  42. NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
  43. uint8_t cKey[self.keySize];
  44. bzero(cKey, sizeof(cKey));
  45. [keyData getBytes:cKey length:self.keySize];
  46. // 设置iv
  47. uint8_t cIv[self.blockSize];
  48. bzero(cIv, self.blockSize);
  49. int option = 0;
  50. /**
  51. kCCOptionPKCS7Padding CBC 的加密
  52. kCCOptionPKCS7Padding | kCCOptionECBMode ECB 的加密
  53. */
  54. if (iv) {
  55. [iv getBytes:cIv length:self.blockSize];
  56. option = kCCOptionPKCS7Padding;
  57. } else {
  58. option = kCCOptionPKCS7Padding | kCCOptionECBMode;
  59. }
  60. // 设置输出缓冲区
  61. NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
  62. size_t bufferSize = [data length] + self.blockSize;
  63. void *buffer = malloc(bufferSize);
  64. // 开始加密
  65. size_t encryptedSize = 0;
  66. /*
  67. CCCrypt 对称加密算法的核心函数(加密/解密)
  68. 第一个参数:kCCEncrypt 加密/ kCCDecrypt 解密
  69. 第二个参数:加密算法,默认使用的是 AES/DES
  70. 第三个参数:加密选项 ECB/CBC
  71. kCCOptionPKCS7Padding CBC 的加密
  72. kCCOptionPKCS7Padding | kCCOptionECBMode ECB 的加密
  73. 第四个参数:加密密钥
  74. 第五个参数:密钥的长度
  75. 第六个参数:初始向量
  76. 第七个参数:加密的数据
  77. 第八个参数:加密的数据长度
  78. 第九个参数:密文的内存地址
  79. 第十个参数:密文缓冲区的大小
  80. 第十一个参数:加密结果的大小
  81. */
  82. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  83. self.algorithm,
  84. option,
  85. cKey,
  86. self.keySize,
  87. cIv,
  88. [data bytes],
  89. [data length],
  90. buffer,
  91. bufferSize,
  92. &encryptedSize);
  93. NSData *result = nil;
  94. if (cryptStatus == kCCSuccess) {
  95. result = [NSData dataWithBytesNoCopy:buffer length:encryptedSize];
  96. } else {
  97. free(buffer);
  98. NSLog(@"[错误] 加密失败|状态编码: %d", cryptStatus);
  99. }
  100. return [result base64EncodedStringWithOptions:0];
  101. }
  102. - (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv
  103. {
  104. if (string == nil) {
  105. return nil;
  106. }
  107. // 设置秘钥
  108. NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
  109. uint8_t cKey[self.keySize];
  110. bzero(cKey, sizeof(cKey));
  111. [keyData getBytes:cKey length:self.keySize];
  112. // 设置iv
  113. uint8_t cIv[self.blockSize];
  114. bzero(cIv, self.blockSize);
  115. int option = 0;
  116. if (iv) {
  117. [iv getBytes:cIv length:self.blockSize];
  118. option = kCCOptionPKCS7Padding;
  119. } else {
  120. option = kCCOptionPKCS7Padding | kCCOptionECBMode;
  121. }
  122. // 设置输出缓冲区
  123. NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
  124. size_t bufferSize = [data length] + self.blockSize;
  125. void *buffer = malloc(bufferSize);
  126. // 开始解密
  127. size_t decryptedSize = 0;
  128. CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  129. self.algorithm,
  130. option,
  131. cKey,
  132. self.keySize,
  133. cIv,
  134. [data bytes],
  135. [data length],
  136. buffer,
  137. bufferSize,
  138. &decryptedSize);
  139. NSData *result = nil;
  140. if (cryptStatus == kCCSuccess) {
  141. result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
  142. } else {
  143. free(buffer);
  144. NSLog(@"[错误] 解密失败|状态编码: %d", cryptStatus);
  145. }
  146. return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
  147. }
  148. + (NSString *)getStringFromGBKStr:(NSString *)gbkStr
  149. {
  150. gbkStr = [gbkStr stringByReplacingOccurrencesOfString:@"0000"withString:@""];
  151. Byte byte[gbkStr.length/2];
  152. NSScanner *hexScanner;
  153. NSString *tmp;
  154. for(NSUInteger i=0;i<gbkStr.length/2;i++){
  155. tmp = [gbkStr substringWithRange:NSMakeRange(i*2,2)];
  156. unsigned int iStr = 0;
  157. hexScanner = [NSScanner scannerWithString:tmp];
  158. [hexScanner scanHexInt:&iStr];
  159. byte[i]=iStr;
  160. }
  161. NSData *data = [NSData dataWithBytes:byte length:gbkStr.length/2];
  162. NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
  163. NSString *retStr = [[NSString alloc] initWithData:data encoding:enc];
  164. return retStr;
  165. }
  166. @end