AESCrypt.m 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  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. if(encryptText==nil)
  86. return nil;
  87. NSString* gIv = nil;
  88. char keyPtr[kCCKeySizeAES128 + 1];
  89. memset(keyPtr, 0, sizeof(keyPtr));
  90. [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  91. char ivPtr[kCCBlockSizeAES128 + 1];
  92. memset(ivPtr, 0, sizeof(ivPtr));
  93. [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
  94. // NSData* d1 = [encryptText dataUsingEncoding:NSUTF8StringEncoding];
  95. NSData *encryptedData =[[NSData alloc] initWithBase64EncodedString:encryptText options:NSDataBase64DecodingIgnoreUnknownCharacters];
  96. //[[NSData alloc] initWithBase64EncodedString:stringBase64 options:NSDataBase64DecodingIgnoreUnknownCharacters];//[NSData base64DataFromString:encryptText];
  97. NSData *data = encryptedData;//[GTMBase64 decodeData:];
  98. NSUInteger dataLength = [data length];
  99. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  100. void *buffer = malloc(bufferSize);
  101. size_t numBytesCrypted = 0;
  102. CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  103. kCCAlgorithmAES128,
  104. 0x0000|kCCOptionECBMode|kCCOptionPKCS7Padding,
  105. keyPtr,
  106. kCCBlockSizeAES128,
  107. ivPtr,
  108. [data bytes],
  109. dataLength,
  110. buffer,
  111. bufferSize,
  112. &numBytesCrypted);
  113. if (cryptStatus == kCCSuccess) {
  114. NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
  115. return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding] ;
  116. }
  117. free(buffer);
  118. return nil;
  119. }
  120. //+(NSString *)AES128Encrypt:(NSString *)plainText key:(NSString*) gkey
  121. //{
  122. // NSString* gIv = nil;
  123. // char keyPtr[kCCKeySizeAES128+1];
  124. // memset(keyPtr, 0, sizeof(keyPtr));
  125. // [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  126. //
  127. // char ivPtr[kCCBlockSizeAES128+1];
  128. // memset(ivPtr, 0, sizeof(ivPtr));
  129. // [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
  130. //
  131. // NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  132. // NSUInteger dataLength = [data length];
  133. //
  134. // int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
  135. // int newSize = 0;
  136. //
  137. // if(diff > 0)
  138. // {
  139. // newSize = dataLength + diff;
  140. // }
  141. //
  142. // char dataPtr[newSize];
  143. // memcpy(dataPtr, [data bytes], [data length]);
  144. // for(int i = 0; i < diff; i++)
  145. // {
  146. // dataPtr[i + dataLength] = 0x00;
  147. // }
  148. //
  149. // size_t bufferSize = newSize + kCCBlockSizeAES128;
  150. // void *buffer = malloc(bufferSize);
  151. // memset(buffer, 0, bufferSize);
  152. //
  153. // size_t numBytesCrypted = 0;
  154. //
  155. // CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  156. // kCCAlgorithmAES128,
  157. // 0x0000|kCCOptionECBMode|kCCOptionPKCS7Padding, //No padding
  158. // keyPtr,
  159. // kCCKeySizeAES128,
  160. // ivPtr,
  161. // dataPtr,
  162. // sizeof(dataPtr),
  163. // buffer,
  164. // bufferSize,
  165. // &numBytesCrypted);
  166. //
  167. // if (cryptStatus == kCCSuccess) {
  168. // NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
  169. //// return [GTMBase64 stringByEncodingData:resultData];
  170. //
  171. //
  172. // NSString *base64EncodedString = [NSString base64StringFromData:resultData length:[resultData length]];
  173. // return base64EncodedString;
  174. // }
  175. // free(buffer);
  176. // return nil;
  177. //}
  178. //
  179. //+(NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString*) gkey
  180. //{
  181. //
  182. // NSString* gIv = nil;
  183. // char keyPtr[kCCKeySizeAES128 + 1];
  184. // memset(keyPtr, 0, sizeof(keyPtr));
  185. // [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  186. //
  187. // char ivPtr[kCCBlockSizeAES128 + 1];
  188. // memset(ivPtr, 0, sizeof(ivPtr));
  189. // [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
  190. //
  191. //
  192. // NSData *encryptedData = [NSData base64DataFromString:encryptText];
  193. // NSData *data = encryptedData;//[GTMBase64 decodeData:[encryptText dataUsingEncoding:NSUTF8StringEncoding]];
  194. // NSUInteger dataLength = [data length];
  195. // size_t bufferSize = dataLength + kCCBlockSizeAES128;
  196. // void *buffer = malloc(bufferSize);
  197. //
  198. // size_t numBytesCrypted = 0;
  199. // CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  200. // kCCAlgorithmAES128,
  201. // 0x0000|kCCOptionECBMode|kCCOptionPKCS7Padding,
  202. // keyPtr,
  203. // kCCBlockSizeAES128,
  204. // ivPtr,
  205. // [data bytes],
  206. // dataLength,
  207. // buffer,
  208. // bufferSize,
  209. // &numBytesCrypted);
  210. // if (cryptStatus == kCCSuccess) {
  211. // NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
  212. // return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding] ;
  213. // }
  214. // free(buffer);
  215. // return nil;
  216. //}
  217. + (NSString *)encrypt:(NSString *)message password:(NSString *)password {
  218. #ifdef ENCRYPT_OFF
  219. return message;
  220. #endif
  221. // message=@"NEW PACIFIC DIRECT";
  222. // NSData* msgdata=[message dataUsingEncoding:NSUTF8StringEncoding];
  223. // NSData* passdata=[password dataUsingEncoding:NSUTF8StringEncoding];
  224. // NSData* SHA256Hash = [passdata SHA256Hash];
  225. // NSString *SHA256Hashresult = [[NSString alloc] initWithData:SHA256Hash encoding:NSUTF8StringEncoding];
  226. // message=@"NEW PACIFIC DIRECT";
  227. NSData *encryptedData = [[message dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptedDataUsingKey:[[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash] error:nil];
  228. NSString *base64EncodedString = [NSString base64StringFromData:encryptedData length:[encryptedData length]];
  229. return base64EncodedString;
  230. }
  231. //+ (NSString *)simple_encrypt:(NSString *)message password:(NSString *)password {
  232. //
  233. //
  234. //
  235. // // message=@"NEW PACIFIC DIRECT";
  236. // // NSData* msgdata=[message dataUsingEncoding:NSUTF8StringEncoding];
  237. // // NSData* passdata=[password dataUsingEncoding:NSUTF8StringEncoding];
  238. // // NSData* SHA256Hash = [passdata SHA256Hash];
  239. // // NSString *SHA256Hashresult = [[NSString alloc] initWithData:SHA256Hash encoding:NSUTF8StringEncoding];
  240. // // message=@"NEW PACIFIC DIRECT";
  241. // // NSString* aaa=[[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash];;
  242. // NSData *encryptedData = [[message dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptedDataUsingKey:password error:nil];
  243. // NSString *base64EncodedString = [NSString base64StringFromData:encryptedData length:[encryptedData length]];
  244. // return base64EncodedString;
  245. //}
  246. + (NSString *)decrypt:(NSString *)base64EncodedString password:(NSString *)password {
  247. #ifdef ENCRYPT_OFF
  248. return base64EncodedString;
  249. #endif
  250. if(base64EncodedString==nil)
  251. return nil;
  252. if(base64EncodedString.length==0)
  253. return @"";
  254. NSData *encryptedData = [NSData base64DataFromString:base64EncodedString];
  255. NSData *decryptedData = [encryptedData decryptedAES256DataUsingKey:[[password dataUsingEncoding:NSUTF8StringEncoding] SHA256Hash] error:nil];
  256. return [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
  257. }
  258. //+ (NSString *)simple_decrypt:(NSString *)base64EncodedString password:(NSString *)password
  259. //{
  260. //
  261. //
  262. // if(base64EncodedString==nil)
  263. // return nil;
  264. // if(base64EncodedString.length==0)
  265. // return @"";
  266. // NSData *encryptedData = [NSData base64DataFromString:base64EncodedString];
  267. // NSData *decryptedData = [encryptedData decryptedAES256DataUsingKey:password error:nil];
  268. // return [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
  269. //}
  270. + (NSString *)fastdecrypt:(NSString *)base64EncodedString
  271. {
  272. NSString* ret=[self decrypt:base64EncodedString password:@"usai"];
  273. if(ret==nil)
  274. ret= @"";
  275. return ret;
  276. }
  277. + (NSString *)fastencrypt:(NSString *)message
  278. {
  279. return [self encrypt:message password:@"usai"];
  280. }
  281. @end