AESCipher.m 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //
  2. // AESCipher.m
  3. // AESCipher
  4. //
  5. // Created by Welkin Xie on 8/13/16.
  6. // Copyright © 2016 WelkinXie. All rights reserved.
  7. //
  8. // https://github.com/WelkinXie/AESCipher-iOS
  9. //
  10. #import "AESCipher.h"
  11. #import <CommonCrypto/CommonCryptor.h>
  12. NSString const *kInitVector = @"KXh9DfxR0UKCEkH2";
  13. size_t const kKeySize = kCCKeySizeAES128;
  14. NSData * cipherOperation(NSData *contentData, NSData *keyData, CCOperation operation) {
  15. NSUInteger dataLength = contentData.length;
  16. void const *initVectorBytes = [kInitVector dataUsingEncoding:NSUTF8StringEncoding].bytes;
  17. void const *contentBytes = contentData.bytes;
  18. void const *keyBytes = keyData.bytes;
  19. size_t operationSize = dataLength + kCCBlockSizeAES128;
  20. void *operationBytes = malloc(operationSize);
  21. if (operationBytes == NULL) {
  22. return nil;
  23. }
  24. size_t actualOutSize = 0;
  25. CCCryptorStatus cryptStatus = CCCrypt(operation,
  26. kCCAlgorithmAES,
  27. kCCOptionPKCS7Padding,
  28. keyBytes,
  29. kKeySize,
  30. initVectorBytes,
  31. contentBytes,
  32. dataLength,
  33. operationBytes,
  34. operationSize,
  35. &actualOutSize);
  36. if (cryptStatus == kCCSuccess) {
  37. return [NSData dataWithBytesNoCopy:operationBytes length:actualOutSize];
  38. }
  39. free(operationBytes);
  40. operationBytes = NULL;
  41. return nil;
  42. }
  43. NSString * aesEncryptString(NSString *content, NSString *key) {
  44. NSCParameterAssert(content);
  45. NSCParameterAssert(key);
  46. NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
  47. NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
  48. NSData *encrptedData = aesEncryptData(contentData, keyData);
  49. return [encrptedData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
  50. }
  51. NSString * aesDecryptString(NSString *content, NSString *key) {
  52. NSCParameterAssert(content);
  53. NSCParameterAssert(key);
  54. NSData *contentData = [[NSData alloc] initWithBase64EncodedString:content options:NSDataBase64DecodingIgnoreUnknownCharacters];
  55. NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
  56. NSData *decryptedData = aesDecryptData(contentData, keyData);
  57. return [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
  58. }
  59. NSData * aesEncryptData(NSData *contentData, NSData *keyData) {
  60. NSCParameterAssert(contentData);
  61. NSCParameterAssert(keyData);
  62. NSString *hint = [NSString stringWithFormat:@"The key size of AES-%lu should be %lu bytes!", kKeySize * 8, kKeySize];
  63. NSCAssert(keyData.length == kKeySize, hint);
  64. return cipherOperation(contentData, keyData, kCCEncrypt);
  65. }
  66. NSData * aesDecryptData(NSData *contentData, NSData *keyData) {
  67. NSCParameterAssert(contentData);
  68. NSCParameterAssert(keyData);
  69. NSString *hint = [NSString stringWithFormat:@"The key size of AES-%lu should be %lu bytes!", kKeySize * 8, kKeySize];
  70. NSCAssert(keyData.length == kKeySize, hint);
  71. return cipherOperation(contentData, keyData, kCCDecrypt);
  72. }