AESUtil.m 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. //
  2. // AESUtil.m
  3. // shiku_im
  4. //
  5. // Created by p on 2019/7/12.
  6. // Copyright © 2019 Reese. All rights reserved.
  7. //
  8. #import "AESUtil.h"
  9. @implementation AESUtil
  10. static Byte iv[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
  11. /*
  12. Aes加密 Data
  13. */
  14. +(NSData *)encryptAESData:(NSData *)data key:(NSData *)keyData {
  15. // NSString *key = [[NSString alloc] initWithData:keyData encoding:NSUTF8StringEncoding];
  16. size_t dataInLength = [data length];
  17. const void * dataIn = (const void *)[data bytes];
  18. CCCryptorStatus ccStatus;
  19. uint8_t *dataOut = NULL;
  20. size_t dataOutMoved = 0;
  21. size_t dataOutAvailable = (dataInLength + kCCBlockSizeAES128) & ~(kCCBlockSizeAES128 - 1);
  22. dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
  23. memset((void *)dataOut, 0x0, dataOutAvailable);//将已开辟内存空间buffer的首个字节的值设为值0
  24. // const void *iv = (const void *) [ivDes cStringUsingEncoding:NSASCIIStringEncoding];
  25. //CCCrypt函数 加密/解密
  26. ccStatus = CCCrypt(kCCEncrypt, //加密/解密
  27. kCCAlgorithmAES128, //加密根据哪个标准(des,3des,aes。。。。)
  28. kCCOptionPKCS7Padding, //选项分组密码算法(des:对每块分组加一次密 3DES:对每块分组加三个不同的密)
  29. [keyData bytes], //密钥 加密和解密的密钥必须一致
  30. kCCKeySizeAES128, //DES密钥的大小(kCCKeySizeDES=8)
  31. iv, //可选的初始矢量
  32. dataIn, //数据的存储单元
  33. dataInLength, //数据的大小
  34. (void *)dataOut, //用于返回数据
  35. dataOutAvailable, //输出大小
  36. &dataOutMoved); //偏移
  37. NSData *data1 = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
  38. free(dataOut);
  39. return data1;
  40. }
  41. /*
  42. Aes解密 Data
  43. */
  44. +(NSData *)decryptAESData:(NSData *)data key:(NSData *)keyData {
  45. const void *dataIn;
  46. size_t dataInLength;
  47. dataInLength = [data length];
  48. dataIn = [data bytes];
  49. CCCryptorStatus ccStatus;
  50. uint8_t *dataOut = NULL; //可以理解位type/typedef 的缩写(有效的维护了代码)
  51. size_t dataOutAvailable = 0; //size_t 是操作符sizeof返回的结果类型
  52. size_t dataOutMoved = 0;
  53. dataOutAvailable = (dataInLength + kCCBlockSizeAES128) & ~(kCCBlockSizeAES128 - 1);
  54. dataOut = malloc( dataOutAvailable * sizeof(uint8_t));
  55. memset((void *)dataOut, 0x0, dataOutAvailable);//将已开辟内存空间buffer的首 1 个字节的值设为值 0
  56. // const void *ivDes = (const void *) [iv cStringUsingEncoding:NSASCIIStringEncoding];
  57. //CCCrypt函数 加密/解密
  58. ccStatus = CCCrypt(kCCDecrypt,// 加密/解密
  59. kCCAlgorithmAES128,// 加密根据哪个标准(des,3des,aes。。。。)
  60. kCCOptionPKCS7Padding,// 选项分组密码算法(des:对每块分组加一次密 3DES:对每块分组加三个不同的密)
  61. [keyData bytes], //密钥 加密和解密的密钥必须一致
  62. kCCKeySizeAES128,// DES 密钥的大小(kCCKeySizeDES=8)
  63. iv, // 可选的初始矢量
  64. dataIn, // 数据的存储单元
  65. dataInLength,// 数据的大小
  66. (void *)dataOut,// 用于返回数据
  67. dataOutAvailable,
  68. &dataOutMoved);
  69. // NSString * plaintStr = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved] encoding:NSUTF8StringEncoding];
  70. NSData *data1 = [NSData dataWithBytes:(const void *)dataOut length:(NSUInteger)dataOutMoved];
  71. free(dataOut);
  72. return data1;
  73. }
  74. @end