AESEncrypt.m 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. //
  2. // AESEncrypt.m
  3. // MQTTLearn
  4. //
  5. // Created by RD on 2020/12/16.
  6. //
  7. #import "AESEncrypt.h"
  8. #import <CommonCrypto/CommonCryptor.h>
  9. #import "GTMBase64.h"
  10. #import "NSString+convert.h"
  11. #define g128key @"1234561234567890" //秘钥
  12. #define g256key @"12345612345678901234561234567890" //秘钥
  13. #define gIv @"22222222222222222222222222222222" //向量
  14. @implementation AESEncrypt
  15. +(NSString *)cbcEncrypt:(NSString *)content key:(NSString *)key
  16. {
  17. NSLog(@"加密数据:%@", content);
  18. if (content != nil && content.length != 0) {
  19. NSString *result = aesEncryptString(content, key, gIv);
  20. NSLog(@"cbc加密:%@", result);
  21. return result;
  22. }
  23. return nil;
  24. }
  25. +(NSString *)ecbEncrypt:(NSString *)content key:(NSString *)key
  26. {
  27. NSLog(@"加密数据:%@", content);
  28. if (content != nil && content.length != 0) {
  29. NSString *result = aesEncryptString(content, key, nil);
  30. NSLog(@"ecb加密:%@", result);
  31. return result;
  32. }
  33. return nil;
  34. }
  35. +(NSString *)cbcDecrypt:(NSString *)content key:(NSString *)key
  36. {
  37. NSLog(@"解密数据:%@", content);
  38. if (content != nil && content.length != 0) {
  39. NSString *result = aesDecryptString(content, key, gIv);
  40. NSLog(@"cbc解密:%@", result);
  41. return result;
  42. }
  43. return nil;
  44. }
  45. +(NSString *)ecbDecrypt:(NSString *)content key:(NSString *)key
  46. {
  47. NSLog(@"解密数据:%@", content);
  48. if (content != nil && content.length != 0) {
  49. NSString *result = aesDecryptString(content, key, nil);
  50. NSLog(@"ecb解密:%@", result);
  51. return result;
  52. }
  53. return nil;
  54. }
  55. NSData * ecbCipherOperation(NSData *contentData, NSData *keyData, CCOperation operation) {
  56. NSUInteger dataLength = contentData.length;
  57. void const *contentBytes = contentData.bytes;
  58. void const *keyBytes = keyData.bytes;
  59. size_t operationSize = dataLength + kCCBlockSizeAES128;
  60. void *operationBytes = malloc(operationSize);
  61. if (operationBytes == NULL) {
  62. return nil;
  63. }
  64. size_t actualOutSize = 0;
  65. CCCryptorStatus cryptStatus = CCCrypt(operation,
  66. kCCAlgorithmAES128,
  67. 0x0000 | kCCOptionECBMode, // noPadding
  68. keyBytes,
  69. kCCKeySizeAES128, // 秘钥长度选择AES128
  70. NULL,//initVectorBytes,
  71. contentBytes,
  72. dataLength,
  73. operationBytes,
  74. operationSize,
  75. &actualOutSize);
  76. if (cryptStatus == kCCSuccess) {
  77. return [NSData dataWithBytesNoCopy:operationBytes length:actualOutSize];
  78. }
  79. free(operationBytes);
  80. operationBytes = NULL;
  81. return nil;
  82. }
  83. NSData * cbcCipherOperation(NSData *contentData, NSData *keyData, NSData *ivData, CCOperation operation) {
  84. NSUInteger dataLength = contentData.length;
  85. void const *initVectorBytes = ivData.bytes;
  86. void const *contentBytes = contentData.bytes;
  87. void const *keyBytes = keyData.bytes;
  88. size_t operationSize = dataLength + kCCBlockSizeAES128;
  89. void *operationBytes = malloc(operationSize);
  90. if (operationBytes == NULL) {
  91. return nil;
  92. }
  93. size_t actualOutSize = 0;
  94. CCCryptorStatus cryptStatus = CCCrypt(operation,
  95. kCCAlgorithmAES128,
  96. 0x0000, // noPadding
  97. keyBytes,
  98. kCCKeySizeAES128, // 秘钥长度选择AES128
  99. initVectorBytes,
  100. contentBytes,
  101. dataLength,
  102. operationBytes,
  103. operationSize,
  104. &actualOutSize);
  105. if (cryptStatus == kCCSuccess) {
  106. return [NSData dataWithBytesNoCopy:operationBytes length:actualOutSize];
  107. }
  108. free(operationBytes);
  109. operationBytes = NULL;
  110. return nil;
  111. }
  112. // 加密
  113. NSString * aesEncryptString(NSString *content, NSString *key, NSString *iv) {
  114. // 把内容转成 data
  115. NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
  116. NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
  117. NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding];
  118. // NSData *contentData = [AESEncrypt convertHexStrToData:content];
  119. // NSData *keyData = [AESEncrypt convertHexStrToData:key];//[key dataUsingEncoding:NSUTF8StringEncoding];
  120. // NSData *ivData = [AESEncrypt convertHexStrToData:iv];
  121. NSData *encrptedData = aesEncryptData(contentData, keyData, ivData);
  122. // 将加密好的数据转成16进制的字符
  123. NSString *result;
  124. result = [AESEncrypt convertDataToHexStr:encrptedData];
  125. return result;
  126. }
  127. // 解密
  128. NSString * aesDecryptString(NSString *content, NSString *key, NSString *iv) {
  129. // 把内容转成 data
  130. // NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
  131. NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
  132. NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding];
  133. NSData *contentData = [AESEncrypt convertHexStrToData:content];
  134. NSData *decryptedData = aesDecryptData(contentData, keyData, ivData);
  135. NSString *result;
  136. result = [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
  137. return result;
  138. }
  139. NSData * aesEncryptData(NSData *contentData, NSData *keyData, NSData *ivData) {
  140. if (ivData) {
  141. return cbcCipherOperation(contentData, keyData, ivData, kCCEncrypt);
  142. }else{
  143. return ecbCipherOperation(contentData, keyData, kCCEncrypt);
  144. }
  145. }
  146. NSData * aesDecryptData(NSData *contentData, NSData *keyData, NSData *ivData) {
  147. if (ivData) {
  148. return cbcCipherOperation(contentData, keyData, ivData, kCCDecrypt);
  149. }else{
  150. return ecbCipherOperation(contentData, keyData, kCCDecrypt);
  151. }
  152. }
  153. // data转十六进制字符串
  154. + (NSString *)convertDataToHexStr:(NSData *)data {
  155. if (!data || [data length] == 0) {
  156. return @"";
  157. }
  158. NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
  159. [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
  160. unsigned char *dataBytes = (unsigned char*)bytes;
  161. for (NSInteger i = 0; i < byteRange.length; i++) {
  162. NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
  163. if ([hexStr length] == 2) {
  164. [string appendString:hexStr];
  165. } else {
  166. [string appendFormat:@"0%@", hexStr];
  167. }
  168. }
  169. }];
  170. return string;
  171. }
  172. // 十六进制字符串转data
  173. + (NSData *)convertHexStrToData:(NSString *)str {
  174. if (!str || [str length] == 0) {
  175. return nil;
  176. }
  177. NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];
  178. NSRange range;
  179. if ([str length] % 2 == 0) {
  180. range = NSMakeRange(0, 2);
  181. } else {
  182. range = NSMakeRange(0, 1);
  183. }
  184. for (NSInteger i = range.location; i < [str length]; i += 2) {
  185. unsigned int anInt;
  186. NSString *hexCharStr = [str substringWithRange:range];
  187. NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
  188. [scanner scanHexInt:&anInt];
  189. NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
  190. [hexData appendData:entity];
  191. range.location += range.length;
  192. range.length = 2;
  193. }
  194. return hexData;
  195. }
  196. @end