AESCrypt.m 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. //
  2. // AESCrypt.m
  3. // Gurpartap Singh
  4. //
  5. // Created by Gurpartap Singh on 06/05/12.
  6. // Copyright (c) 2012 Gurpartap Singh
  7. //
  8. // MIT License
  9. //
  10. // Permission is hereby granted, free of charge, to any person obtaining
  11. // a copy of this software and associated documentation files (the
  12. // "Software"), to deal in the Software without restriction, including
  13. // without limitation the rights to use, copy, modify, merge, publish,
  14. // distribute, sublicense, and/or sell copies of the Software, and to
  15. // permit persons to whom the Software is furnished to do so, subject to
  16. // the following conditions:
  17. //
  18. // The above copyright notice and this permission notice shall be
  19. // included in all copies or substantial portions of the Software.
  20. //
  21. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  22. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  23. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  24. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  25. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  26. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  27. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  28. //
  29. #import "AESCrypt.h"
  30. #import "NSData+Base64.h"
  31. #import "NSString+Base64.h"
  32. #import "NSData+CommonCrypto.h"
  33. #import "config.h"
  34. @implementation AESCrypt
  35. #pragma simple aes
  36. +(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString*) gkey
  37. {
  38. NSString* gIv = nil;
  39. char keyPtr[kCCKeySizeAES128+1];
  40. memset(keyPtr, 0, sizeof(keyPtr));
  41. [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  42. char ivPtr[kCCBlockSizeAES128+1];
  43. memset(ivPtr, 0, sizeof(ivPtr));
  44. [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
  45. NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  46. NSUInteger dataLength = [data length];
  47. int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
  48. size_t newSize = 0;
  49. if(diff > 0)
  50. {
  51. newSize = dataLength + diff;
  52. }
  53. // char dataPtr[newSize];
  54. // memcpy(dataPtr, [data bytes], [data length]);
  55. // for(int i = 0; i < diff; i++)
  56. // {
  57. // dataPtr[i + dataLength] = 0x00;
  58. // }
  59. size_t bufferSize = newSize + kCCBlockSizeAES128;
  60. void *buffer = malloc(bufferSize);
  61. memset(buffer, 0, bufferSize);
  62. size_t numBytesCrypted = 0;
  63. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  64. kCCAlgorithmAES128,
  65. 0x0000|kCCOptionECBMode|kCCOptionPKCS7Padding, //No padding
  66. keyPtr,
  67. kCCKeySizeAES128,
  68. ivPtr,
  69. [data bytes],
  70. [data length],
  71. buffer,
  72. bufferSize,
  73. &numBytesCrypted);
  74. if (cryptStatus == kCCSuccess) {
  75. NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
  76. // return [GTMBase64 stringByEncodingData:resultData];
  77. NSString *base64EncodedString = [resultData base64EncodedStringWithOptions:0];//[NSString base64StringFromData:resultData length:[resultData length]];
  78. return base64EncodedString;
  79. }
  80. free(buffer);
  81. return nil;
  82. }
  83. +(NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString*) gkey
  84. {
  85. NSString* gIv = nil;
  86. char keyPtr[kCCKeySizeAES128 + 1];
  87. memset(keyPtr, 0, sizeof(keyPtr));
  88. [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  89. char ivPtr[kCCBlockSizeAES128 + 1];
  90. memset(ivPtr, 0, sizeof(ivPtr));
  91. [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
  92. // NSData* d1 = [encryptText dataUsingEncoding:NSUTF8StringEncoding];
  93. NSData *encryptedData =[[NSData alloc] initWithBase64EncodedString:encryptText options:NSDataBase64DecodingIgnoreUnknownCharacters];
  94. //[[NSData alloc] initWithBase64EncodedString:stringBase64 options:NSDataBase64DecodingIgnoreUnknownCharacters];//[NSData base64DataFromString:encryptText];
  95. NSData *data = encryptedData;//[GTMBase64 decodeData:];
  96. NSUInteger dataLength = [data length];
  97. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  98. void *buffer = malloc(bufferSize);
  99. size_t numBytesCrypted = 0;
  100. CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  101. kCCAlgorithmAES128,
  102. 0x0000|kCCOptionECBMode|kCCOptionPKCS7Padding,
  103. keyPtr,
  104. kCCBlockSizeAES128,
  105. ivPtr,
  106. [data bytes],
  107. dataLength,
  108. buffer,
  109. bufferSize,
  110. &numBytesCrypted);
  111. if (cryptStatus == kCCSuccess) {
  112. NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
  113. return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding] ;
  114. }
  115. free(buffer);
  116. return nil;
  117. }
  118. //+(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString*) gkey
  119. //{
  120. // NSString* gIv = nil;
  121. // char keyPtr[kCCKeySizeAES128+1];
  122. // memset(keyPtr, 0, sizeof(keyPtr));
  123. // [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  124. //
  125. // char ivPtr[kCCBlockSizeAES128+1];
  126. // memset(ivPtr, 0, sizeof(ivPtr));
  127. // [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
  128. //
  129. // NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  130. // NSUInteger dataLength = [data length];
  131. //
  132. // int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
  133. // int newSize = 0;
  134. //
  135. // if(diff > 0)
  136. // {
  137. // newSize = dataLength + diff;
  138. // }
  139. //
  140. // char dataPtr[newSize];
  141. // memcpy(dataPtr, [data bytes], [data length]);
  142. // for(int i = 0; i < diff; i++)
  143. // {
  144. // dataPtr[i + dataLength] = 0x00;
  145. // }
  146. //
  147. // size_t bufferSize = newSize + kCCBlockSizeAES128;
  148. // void *buffer = malloc(bufferSize);
  149. // memset(buffer, 0, bufferSize);
  150. //
  151. // size_t numBytesCrypted = 0;
  152. //
  153. // CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  154. // kCCAlgorithmAES128,
  155. // 0x0000|kCCOptionECBMode|kCCOptionPKCS7Padding, //No padding
  156. // keyPtr,
  157. // kCCKeySizeAES128,
  158. // ivPtr,
  159. // dataPtr,
  160. // sizeof(dataPtr),
  161. // buffer,
  162. // bufferSize,
  163. // &numBytesCrypted);
  164. //
  165. // if (cryptStatus == kCCSuccess) {
  166. // NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
  167. //// return [GTMBase64 stringByEncodingData:resultData];
  168. //
  169. //
  170. // NSString *base64EncodedString = [NSString base64StringFromData:resultData length:[resultData length]];
  171. // return base64EncodedString;
  172. // }
  173. // free(buffer);
  174. // return nil;
  175. //}
  176. //
  177. //+(NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString*) gkey
  178. //{
  179. //
  180. // NSString* gIv = nil;
  181. // char keyPtr[kCCKeySizeAES128 + 1];
  182. // memset(keyPtr, 0, sizeof(keyPtr));
  183. // [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  184. //
  185. // char ivPtr[kCCBlockSizeAES128 + 1];
  186. // memset(ivPtr, 0, sizeof(ivPtr));
  187. // [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
  188. //
  189. //
  190. // NSData *encryptedData = [NSData base64DataFromString:encryptText];
  191. // NSData *data = encryptedData;//[GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
  192. // NSUInteger dataLength = [data length];
  193. // size_t bufferSize = dataLength + kCCBlockSizeAES128;
  194. // void *buffer = malloc(bufferSize);
  195. //
  196. // size_t numBytesCrypted = 0;
  197. // CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  198. // kCCAlgorithmAES128,
  199. // 0x0000|kCCOptionECBMode|kCCOptionPKCS7Padding,
  200. // keyPtr,
  201. // kCCBlockSizeAES128,
  202. // ivPtr,
  203. // [data bytes],
  204. // dataLength,
  205. // buffer,
  206. // bufferSize,
  207. // &numBytesCrypted);
  208. // if (cryptStatus == kCCSuccess) {
  209. // NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
  210. // return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding] ;
  211. // }
  212. // free(buffer);
  213. // return nil;
  214. //}
  215. + (NSString *)encrypt:(NSString *)message password:(NSString *)password {
  216. #ifdef ENCRYPT_OFF
  217. return message;
  218. #endif
  219. // message=@"NEW PACIFIC DIRECT";
  220. // NSData* msgdata=[message dataUsingEncoding:NSUTF8StringEncoding];
  221. // NSData* passdata=[password dataUsingEncoding:NSUTF8StringEncoding];
  222. // NSData* SHA256Hash = [passdata SHA256Hash];
  223. // NSString *SHA256Hashresult = [[NSString alloc] initWithData:SHA256Hash encoding:NSUTF8StringEncoding];
  224. // message=@"NEW PACIFIC DIRECT";
  225. NSData *encryptedData = [[message dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptedDataUsingKey:[[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash] error:nil];
  226. NSString *base64EncodedString = [NSString base64StringFromData:encryptedData length:[encryptedData length]];
  227. return base64EncodedString;
  228. }
  229. //+ (NSString *)simple_encrypt:(NSString *)message password:(NSString *)password {
  230. //
  231. //
  232. //
  233. // // message=@"NEW PACIFIC DIRECT";
  234. // // NSData* msgdata=[message dataUsingEncoding:NSUTF8StringEncoding];
  235. // // NSData* passdata=[password dataUsingEncoding:NSUTF8StringEncoding];
  236. // // NSData* SHA256Hash = [passdata SHA256Hash];
  237. // // NSString *SHA256Hashresult = [[NSString alloc] initWithData:SHA256Hash encoding:NSUTF8StringEncoding];
  238. // // message=@"NEW PACIFIC DIRECT";
  239. // // NSString* aaa=[[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash];;
  240. // NSData *encryptedData = [[message dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptedDataUsingKey:password error:nil];
  241. // NSString *base64EncodedString = [NSString base64StringFromData:encryptedData length:[encryptedData length]];
  242. // return base64EncodedString;
  243. //}
  244. + (NSString *)decrypt:(NSString *)base64EncodedString password:(NSString *)password {
  245. #ifdef ENCRYPT_OFF
  246. return base64EncodedString;
  247. #endif
  248. if(base64EncodedString==nil)
  249. return nil;
  250. if(base64EncodedString.length==0)
  251. return @"";
  252. NSData *encryptedData = [NSData base64DataFromString:base64EncodedString];
  253. NSData *decryptedData = [encryptedData decryptedAES256DataUsingKey:[[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash] error:nil];
  254. return [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
  255. }
  256. //+ (NSString *)simple_decrypt:(NSString *)base64EncodedString password:(NSString *)password
  257. //{
  258. //
  259. //
  260. // if(base64EncodedString==nil)
  261. // return nil;
  262. // if(base64EncodedString.length==0)
  263. // return @"";
  264. // NSData *encryptedData = [NSData base64DataFromString:base64EncodedString];
  265. // NSData *decryptedData = [encryptedData decryptedAES256DataUsingKey:password error:nil];
  266. // return [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
  267. //}
  268. + (NSString *)fastdecrypt:(NSString *)base64EncodedString
  269. {
  270. NSString* ret=[self decrypt:base64EncodedString password:@"usai"];
  271. if(ret==nil)
  272. ret= @"";
  273. return ret;
  274. }
  275. + (NSString *)fastencrypt:(NSString *)message
  276. {
  277. return [self encrypt:message password:@"usai"];
  278. }
  279. @end