欢迎光临朱凯的个人博客!
朱凯,a3.work

IOSAES加密与解密

 发布时间: 2017-12-23 18:05      原创:  朱凯      评论: .       .人查看

AES加密需要配置参数

//AES参数: 加密模式CBC(系统默认) 填充方式:PKCS7Padding 字符集:utf8 输出:base64
NSString const *AESKey = @"keykeykey";                //AESKey
NSString const *AESVector = @"123456789";             //初始向量
uint32_t const AESFillType = kCCOptionPKCS7Padding;   //填充方式
size_t const AESKeySize = kCCKeySizeAES128;           //字符集

加密

-(NSString *)KAES128Encrypt:(NSString *)str{
  NSData *contentData = [str dataUsingEncoding:NSUTF8StringEncoding];
  NSUInteger dataLength = contentData.length;
  // 为结束符'\0' +1
  char keyPtr[AESKeySize + 1];
  memset(keyPtr, 0, sizeof(keyPtr));
  [AESKey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  // 密文长度 <= 明文长度 + BlockSize
  size_t encryptSize = dataLength + kCCBlockSizeAES128;
  void *encryptedBytes = malloc(encryptSize);
  size_t actualOutSize = 0;
  NSData *initVector = [AESVector dataUsingEncoding:NSUTF8StringEncoding];
  CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                        kCCAlgorithmAES,
                        // 系统默认使用 CBC,然后指明使用 PKCS7Padding
                        AESFillType,
                        keyPtr,
                        AESKeySize,
                        initVector.bytes,
                        contentData.bytes,
                        dataLength,
                        encryptedBytes,
                        encryptSize,
                        &actualOutSize);
  if (cryptStatus == kCCSuccess) {
	// 对加密后的数据进行 base64 编码
	  return [[NSData dataWithBytesNoCopy:encryptedBytes length:actualOutSize] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    }
  free(encryptedBytes);
  return nil;
}

解密

-(NSString *)KAES128Dencrypt:(NSString *)str{
  NSData *contentData = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];
  NSUInteger dataLength = contentData.length;
  char keyPtr[AESKeySize + 1];
  memset(keyPtr, 0, sizeof(keyPtr));
  [AESKey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  size_t decryptSize = dataLength + kCCBlockSizeAES128;
  void *decryptedBytes = malloc(decryptSize);
  size_t actualOutSize = 0;
  NSData *initVector = [AESVector dataUsingEncoding:NSUTF8StringEncoding];
  CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                        kCCAlgorithmAES,
                        AESFillType,
                        keyPtr,
                        AESKeySize,
                        initVector.bytes,
                        contentData.bytes,
                        dataLength,
                        decryptedBytes,
                        decryptSize,
                        &actualOutSize);
  if (cryptStatus == kCCSuccess) {
	return [[NSString alloc] initWithData:[NSData dataWithBytesNoCopy:decryptedBytes length:actualOutSize] encoding:NSUTF8StringEncoding];
  }
  free(decryptedBytes);
  return nil;
}

转载请注明来源:   IOSAES加密与解密  - 朱凯博客

分享是一种快乐,也是一种美德:
¥打开支付宝,扫码领红包¥ 红包

支付宝 aliPay

微信 wxPay