DESUtil.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. //
  2. // DESUtil.m
  3. // shiku_im
  4. //
  5. // Created by 1 on 17/4/27.
  6. // Copyright © 2017年 Reese. All rights reserved.
  7. //
  8. #import "DESUtil.h"
  9. @interface DESUtil()
  10. +(NSString *)encryptDESStr:(NSString *)sText key:(NSString *)key andDesiv:(NSString *)ivDes;
  11. +(NSString *)decryptDESStr:(NSString *)sText key:(NSString *)key andDesiv:(NSString *)ivDes;
  12. @end
  13. @implementation DESUtil
  14. static Byte iv[] = {1,2,3,4,5,6,7,8};
  15. //+(NSString *)encryptUseDES:(NSString *)plainText key:(NSString *)key
  16. //{
  17. // if (!plainText || [plainText isEqualToString:@""]) {
  18. // return @"";
  19. // }
  20. //
  21. // NSString *ciphertext = nil;
  22. //
  23. // NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  24. //
  25. // NSUInteger dataLength = [textData length];
  26. //
  27. // long isAdd = dataLength%8;
  28. // isAdd > 0 ? (isAdd = dataLength/8 + 1) : (isAdd = dataLength/8);
  29. //
  30. // unsigned char buffer[isAdd*8];
  31. // memset(buffer, 0, isAdd*8*sizeof(char));
  32. //
  33. // size_t bufferSize = dataLength + kCCBlockSizeDES;
  34. // size_t numBytesEncrypted = 0;
  35. //
  36. // CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  37. // kCCAlgorithmDES,
  38. // kCCOptionPKCS7Padding,
  39. // [key UTF8String],
  40. // kCCKeySizeDES,
  41. // iv,
  42. // [textData bytes],
  43. // dataLength,
  44. // buffer,
  45. // bufferSize,
  46. // &numBytesEncrypted);
  47. //
  48. // if (cryptStatus == kCCSuccess) {
  49. //
  50. // NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
  51. //
  52. // ciphertext = [data base64EncodedStringWithOptions:0];
  53. //
  54. // }
  55. //
  56. // return ciphertext;
  57. //
  58. //}
  59. //+(NSString *)decryptUseDES:(NSString *)cipherText key:(NSString *)key
  60. //{
  61. // if (!cipherText || [cipherText isEqualToString:@""]) {
  62. // return @"";
  63. // }
  64. //
  65. // NSString *plaintext = nil;
  66. // NSData *cipherdata = [[NSData alloc] initWithBase64EncodedString:cipherText options:NSDataBase64DecodingIgnoreUnknownCharacters];
  67. // NSUInteger dataLength = [cipherdata length];
  68. //
  69. //
  70. // size_t dataOutAvailable = 0; //size_t 是操作符sizeof返回的结果类型
  71. // dataOutAvailable = (dataLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
  72. //
  73. // long isAdd = dataLength%8;
  74. // isAdd > 0 ? (isAdd = dataLength/8 + 1) : (isAdd = dataLength/8);
  75. //
  76. // unsigned char buffer[isAdd*8];
  77. // memset(buffer, 0, isAdd*8*sizeof(char));
  78. // size_t numBytesDecrypted = 0;
  79. // CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  80. // kCCAlgorithmDES,
  81. // kCCOptionPKCS7Padding,
  82. // [key UTF8String],
  83. // kCCKeySizeDES,
  84. // iv,
  85. // [cipherdata bytes],
  86. // [cipherdata length],
  87. // buffer,
  88. // dataOutAvailable,
  89. // &numBytesDecrypted);
  90. // if(cryptStatus == kCCSuccess) {
  91. // NSData *plaindata = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];
  92. // plaintext = [[NSString alloc]initWithData:plaindata encoding:NSUTF8StringEncoding];
  93. // }
  94. // return plaintext;
  95. //}
  96. +(NSString *)encryptDESStr:(NSString *)sText key:(NSString *)key{
  97. return [self encryptDESStr:sText key:key andDesiv:nil];
  98. }
  99. +(NSString *)decryptDESStr:(NSString *)sText key:(NSString *)key{
  100. return [self decryptDESStr:sText key:key andDesiv:nil];
  101. }
  102. +(NSString *)encryptDESStr:(NSString *)sText key:(NSString *)key andDesiv:(NSString *)ivDes
  103. {
  104. sText = [NSString stringWithFormat:@"%@",sText];
  105. if ((sText == nil || sText.length == 0) || (key == nil || key.length == 0)/*
  106. || (ivDes == nil || ivDes.length == 0)*/)
  107. {
  108. return @"";
  109. }
  110. NSData* encryptData = [sText dataUsingEncoding:NSUTF8StringEncoding];
  111. size_t dataInLength = [encryptData length];
  112. const void * dataIn = (const void *)[encryptData bytes];
  113. CCCryptorStatus ccStatus;
  114. uint8_t *dataOut = NULL;
  115. size_t dataOutMoved = 0;
  116. size_t dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
  117. dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
  118. memset((void *)dataOut, 0x0, dataOutAvailable);//将已开辟内存空间buffer的首个字节的值设为值0
  119. // const void *iv = (const void *) [ivDes cStringUsingEncoding:NSASCIIStringEncoding];
  120. //CCCrypt函数 加密/解密
  121. ccStatus = CCCrypt(kCCEncrypt, //加密/解密
  122. kCCAlgorithm3DES, //加密根据哪个标准(des,3des,aes。。。。)
  123. kCCOptionPKCS7Padding, //选项分组密码算法(des:对每块分组加一次密 3DES:对每块分组加三个不同的密)
  124. [key UTF8String], //密钥 加密和解密的密钥必须一致
  125. kCCKeySize3DES, //DES密钥的大小(kCCKeySizeDES=8)
  126. iv, //可选的初始矢量
  127. dataIn, //数据的存储单元
  128. dataInLength, //数据的大小
  129. (void *)dataOut, //用于返回数据
  130. dataOutAvailable, //输出大小
  131. &dataOutMoved); //偏移
  132. //编码 base64
  133. NSData *data = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
  134. NSString *cipherStr = [data base64EncodedStringWithOptions:0];
  135. free(dataOut);
  136. return cipherStr;
  137. }
  138. +(NSString *)decryptDESStr:(NSString *)sText key:(NSString *)key andDesiv:(NSString *)ivDes
  139. {
  140. if ((sText == nil || sText.length == 0) || (key == nil || key.length == 0)/*
  141. || (ivDes == nil || ivDes.length == 0)*/)
  142. {
  143. return @"";
  144. }
  145. const void *dataIn;
  146. size_t dataInLength;
  147. NSData *decryptData = [[NSData alloc] initWithBase64EncodedString:sText options:NSDataBase64DecodingIgnoreUnknownCharacters];
  148. dataInLength = [decryptData length];
  149. dataIn = [decryptData bytes];
  150. CCCryptorStatus ccStatus;
  151. uint8_t *dataOut = NULL; //可以理解位type/typedef 的缩写(有效的维护了代码)
  152. size_t dataOutAvailable = 0; //size_t 是操作符sizeof返回的结果类型
  153. size_t dataOutMoved = 0;
  154. dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
  155. dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
  156. memset((void *)dataOut, 0x0, dataOutAvailable);//将已开辟内存空间buffer的首 1 个字节的值设为值 0
  157. // const void *ivDes = (const void *) [iv cStringUsingEncoding:NSASCIIStringEncoding];
  158. //CCCrypt函数 加密/解密
  159. ccStatus = CCCrypt(kCCDecrypt,// 加密/解密
  160. kCCAlgorithm3DES,// 加密根据哪个标准(des,3des,aes。。。。)
  161. kCCOptionPKCS7Padding,// 选项分组密码算法(des:对每块分组加一次密 3DES:对每块分组加三个不同的密)
  162. [key UTF8String], //密钥 加密和解密的密钥必须一致
  163. kCCKeySize3DES,// DES 密钥的大小(kCCKeySizeDES=8)
  164. iv, // 可选的初始矢量
  165. dataIn, // 数据的存储单元
  166. dataInLength,// 数据的大小
  167. (void *)dataOut,// 用于返回数据
  168. dataOutAvailable,
  169. &dataOutMoved);
  170. NSString * plaintStr = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding];
  171. free(dataOut);
  172. return plaintStr;
  173. }
  174. //+(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key
  175. //{
  176. // NSString *ciphertext = nil;
  177. // NSData *textData = [clearText dataUsingEncoding:NSUTF8StringEncoding];
  178. // NSUInteger dataLength = [textData length];
  179. // unsigned long len = dataLength;
  180. // size_t bufferSize = dataLength + kCCBlockSizeAES128;
  181. // unsigned char buffer[len];
  182. // size_t numBytesEncrypted = 0;
  183. // static Byte ffff[] = {1,2,3,4,5,6,7,8};
  184. // // CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  185. // // kCCAlgorithmDES,
  186. // // kCCOptionPKCS7Padding | kCCOptionECBMode,
  187. // // [key UTF8String],
  188. // // kCCBlockSizeDES,
  189. // // NULL,
  190. // // [textData bytes],
  191. // // dataLength,
  192. // // buffer,
  193. // // bufferSize,
  194. // // &numBytesEncrypted);
  195. //
  196. // CCCryptorStatus cryptStatus2 = CCCrypt(kCCEncrypt,//模式
  197. // kCCAlgorithmDES,//加密方式
  198. // kCCOptionPKCS7Padding | kCCOptionECBMode,//填充算法
  199. // [@"12345678" UTF8String],//密匙字符串
  200. // kCCKeySizeDES,//加密位数
  201. // ffff,//可选初始化向量
  202. // [textData bytes],//加密数据
  203. // dataLength,//数据长
  204. // buffer,//输出
  205. // bufferSize,//dataOutAvailable
  206. // &numBytesEncrypted);//*dataOutMoved
  207. //
  208. // if (cryptStatus2 == kCCSuccess) {
  209. // NSLog(@"DES加密成功");
  210. //
  211. // NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
  212. // NSString * base = [data base64EncodedStringWithOptions:0];
  213. // ciphertext = [self stringWithHexBytes2:data];
  214. //
  215. // }else{
  216. // NSLog(@"DES加密失败");
  217. // }
  218. // NSLog(@"%@",[self decryptUseDES:ciphertext key:key]);
  219. //// free(buffer);
  220. // return ciphertext;
  221. //}
  222. //
  223. //+(NSString *) decryptUseDES:(NSString *)plainText key:(NSString *)key
  224. //{
  225. // NSString *cleartext = nil;
  226. // NSData *textData = [self parseHexToByteArray:plainText];
  227. // NSUInteger dataLength = [textData length];
  228. // unsigned long len = dataLength;
  229. // size_t bufferSize = dataLength + kCCBlockSizeAES128;
  230. // unsigned char buffer[len];
  231. // memset(buffer, 0, sizeof(char));
  232. // size_t numBytesEncrypted = 0;
  233. //
  234. //
  235. // CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  236. // kCCAlgorithmDES,
  237. // kCCOptionPKCS7Padding,
  238. // [key UTF8String],
  239. // kCCKeySizeDES,
  240. // NULL,
  241. // [textData bytes],
  242. // dataLength,
  243. // buffer,
  244. // bufferSize,
  245. // &numBytesEncrypted);
  246. // if (cryptStatus == kCCSuccess) {
  247. // NSLog(@"DES解密成功");
  248. //
  249. // NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
  250. // cleartext = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  251. // }else{
  252. // NSLog(@"DES解密失败");
  253. // }
  254. //
  255. //// free(buffer);
  256. // return cleartext;
  257. //}
  258. /*
  259. nsdata转成16进制字符串
  260. */
  261. + (NSString*)stringWithHexBytes2:(NSData *)sender {
  262. static const char hexdigits[] = "0123456789ABCDEF";
  263. const size_t numBytes = [sender length];
  264. const unsigned char* bytes = [sender bytes];
  265. char *strbuf = (char *)malloc(numBytes * 2 + 1);
  266. char *hex = strbuf;
  267. NSString *hexBytes = nil;
  268. for (int i = 0; i<numBytes; ++i) {
  269. const unsigned char c = *bytes++;
  270. *hex++ = hexdigits[(c >> 4) & 0xF];
  271. *hex++ = hexdigits[(c ) & 0xF];
  272. }
  273. *hex = 0;
  274. hexBytes = [NSString stringWithUTF8String:strbuf];
  275. // free(strbuf);
  276. return hexBytes;
  277. }
  278. /*
  279. 将16进制数据转化成NSData 数组
  280. */
  281. +(NSData*) parseHexToByteArray:(NSString*) hexString
  282. {
  283. int j=0;
  284. Byte bytes[hexString.length];
  285. for(int i=0;i<[hexString length];i++)
  286. {
  287. int int_ch; /// 两位16进制数转化后的10进制数
  288. unichar hex_char1 = [hexString characterAtIndex:i]; ////两位16进制数中的第一位(高位*16)
  289. int int_ch1;
  290. if(hex_char1 >= '0' && hex_char1 <='9')
  291. int_ch1 = (hex_char1-48)*16; //// 0 的Ascll - 48
  292. else if(hex_char1 >= 'A' && hex_char1 <='F')
  293. int_ch1 = (hex_char1-55)*16; //// A 的Ascll - 65
  294. else
  295. int_ch1 = (hex_char1-87)*16; //// a 的Ascll - 97
  296. i++;
  297. unichar hex_char2 = [hexString characterAtIndex:i]; ///两位16进制数中的第二位(低位)
  298. int int_ch2;
  299. if(hex_char2 >= '0' && hex_char2 <='9')
  300. int_ch2 = (hex_char2-48); //// 0 的Ascll - 48
  301. else if(hex_char2 >= 'A' && hex_char1 <='F')
  302. int_ch2 = hex_char2-55; //// A 的Ascll - 65
  303. else
  304. int_ch2 = hex_char2-87; //// a 的Ascll - 97
  305. int_ch = int_ch1+int_ch2;
  306. bytes[j] = int_ch; ///将转化后的数放入Byte数组里
  307. j++;
  308. }
  309. NSData *newData = [[NSData alloc] initWithBytes:bytes length:hexString.length/2];
  310. return newData;
  311. }
  312. /*
  313. Des加密 Data
  314. */
  315. +(NSData *)encryptDESData:(NSData *)data key:(NSData *)keyData {
  316. NSString *key = [[NSString alloc] initWithData:keyData encoding:NSUTF8StringEncoding];
  317. size_t dataInLength = [data length];
  318. const void * dataIn = (const void *)[data bytes];
  319. CCCryptorStatus ccStatus;
  320. uint8_t *dataOut = NULL;
  321. size_t dataOutMoved = 0;
  322. size_t dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
  323. dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
  324. memset((void *)dataOut, 0x0, dataOutAvailable);//将已开辟内存空间buffer的首个字节的值设为值0
  325. // const void *iv = (const void *) [ivDes cStringUsingEncoding:NSASCIIStringEncoding];
  326. //CCCrypt函数 加密/解密
  327. ccStatus = CCCrypt(kCCEncrypt, //加密/解密
  328. kCCAlgorithm3DES, //加密根据哪个标准(des,3des,aes。。。。)
  329. kCCOptionPKCS7Padding, //选项分组密码算法(des:对每块分组加一次密 3DES:对每块分组加三个不同的密)
  330. [key UTF8String], //密钥 加密和解密的密钥必须一致
  331. kCCKeySize3DES, //DES密钥的大小(kCCKeySizeDES=8)
  332. iv, //可选的初始矢量
  333. dataIn, //数据的存储单元
  334. dataInLength, //数据的大小
  335. (void *)dataOut, //用于返回数据
  336. dataOutAvailable, //输出大小
  337. &dataOutMoved); //偏移
  338. //编码 base64
  339. NSData *data1 = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
  340. free(dataOut);
  341. return data1;
  342. }
  343. /*
  344. Des解密 Data
  345. */
  346. +(NSData *)decryptDESData:(NSData *)data key:(NSData *)keyData {
  347. NSString *key = [[NSString alloc] initWithData:keyData encoding:NSUTF8StringEncoding];
  348. const void *dataIn;
  349. size_t dataInLength;
  350. dataInLength = [data length];
  351. dataIn = [data bytes];
  352. CCCryptorStatus ccStatus;
  353. uint8_t *dataOut = NULL; //可以理解位type/typedef 的缩写(有效的维护了代码)
  354. size_t dataOutAvailable = 0; //size_t 是操作符sizeof返回的结果类型
  355. size_t dataOutMoved = 0;
  356. dataOutAvailable = (dataInLength + kCCBlockSizeDES) & ~(kCCBlockSizeDES - 1);
  357. dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
  358. memset((void *)dataOut, 0x0, dataOutAvailable);//将已开辟内存空间buffer的首 1 个字节的值设为值 0
  359. // const void *ivDes = (const void *) [iv cStringUsingEncoding:NSASCIIStringEncoding];
  360. //CCCrypt函数 加密/解密
  361. ccStatus = CCCrypt(kCCDecrypt,// 加密/解密
  362. kCCAlgorithm3DES,// 加密根据哪个标准(des,3des,aes。。。。)
  363. kCCOptionPKCS7Padding,// 选项分组密码算法(des:对每块分组加一次密 3DES:对每块分组加三个不同的密)
  364. [key UTF8String], //密钥 加密和解密的密钥必须一致
  365. kCCKeySize3DES,// DES 密钥的大小(kCCKeySizeDES=8)
  366. iv, // 可选的初始矢量
  367. dataIn, // 数据的存储单元
  368. dataInLength,// 数据的大小
  369. (void *)dataOut,// 用于返回数据
  370. dataOutAvailable,
  371. &dataOutMoved);
  372. // NSString * plaintStr = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding];
  373. free(dataOut);
  374. return [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
  375. }
  376. @end