关于IOS 的AES加密

//
//  AESEncryptTool.m
//  太公管工
//
//  Created by 李松 on 2021/9/11.
//  Copyright © 2021 姜太公. All rights reserved.
//

#import "AESEncryptTool.h"

static NSString* const key = @"00000000000000000000000000000000";
static NSString* const iv  = @"0000000000000000";

@implementation AESEncryptTool

// MARK: ===============加密===============
+ (NSString *)AES256Encrypt:(NSString *)content Key:(NSString *)key {
    if (content.length == 0) {
        return @"";
    }
    
    NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
    
    NSData *resultData = [AESEncryptTool CCCryptWithOptration:kCCEncrypt Data:data Key:key];
    
    return [resultData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
}
// MARK: ===============解密===============
+ (NSString *)AES256Decrypt:(NSString *)content Key:(NSString *)key {
    if (content.length == 0) {
        return @"";
    }
    
    NSData *data = [[NSData alloc]initWithBase64EncodedString:content options:NSDataBase64DecodingIgnoreUnknownCharacters];
    
    NSData *resultData = [AESEncryptTool CCCryptWithOptration:kCCDecrypt Data:data Key:key];
    
    return [[NSString alloc]initWithData:resultData encoding:NSUTF8StringEncoding];
}
+ (NSData *)CCCryptWithOptration:(CCOperation)operation Data:(NSData *)data Key:(NSString *)key {
    char keyPtr[kCCKeySizeAES256 + 1];
    
    bzero(keyPtr, sizeof(keyPtr));
    
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    // IV
    char ivPtr[kCCBlockSizeAES128 + 1];
    
    bzero(ivPtr, sizeof(ivPtr));
    
    NSString *iv = [key substringToIndex:16];
    
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    size_t bufferSize = data.length + kCCBlockSizeAES128;
    
    void *buffer = malloc(bufferSize);
    
    size_t actualOutSize = 0;
    
    CCCryptorStatus cryptorStatus = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, ivPtr, data.bytes, data.length, buffer, bufferSize, &actualOutSize);
    
    if(cryptorStatus == kCCSuccess){
        NSData *data = [NSData dataWithBytesNoCopy:buffer length:actualOutSize];
        
        return data;
    }
    
    free(buffer);
    
    return nil;

}
+ (NSString *)AES128Encrypt:(NSString *)content Key:(NSString *)key {
    if (content.length == 0) {
        return @"";
    }
    
    NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
    
    NSData *resultData = [AESEncryptTool Aes128CCCryptWithOptration:kCCEncrypt Data:data Key:key];
    
    return [resultData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
}
+ (NSString *)AES128Decrypt:(NSString *)content Key:(NSString *)key {
    if (content.length == 0) {
        return @"";
    }
    
    NSData *data = [[NSData alloc]initWithBase64EncodedString:content options:NSDataBase64DecodingIgnoreUnknownCharacters];
    
    NSData *resultData = [AESEncryptTool Aes128CCCryptWithOptration:kCCDecrypt Data:data Key:key];
    
    return [[NSString alloc]initWithData:resultData encoding:NSUTF8StringEncoding];
}
+ (NSData *)Aes128CCCryptWithOptration:(CCOperation)operation Data:(NSData *)data Key:(NSString *)key {
    char keyPtr[kCCKeySizeAES128 + 1];
    
    memset(keyPtr, 0, sizeof(keyPtr));
    
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    char ivPtr[kCCBlockSizeAES128 + 1];
    
    memset(ivPtr, 0, sizeof(ivPtr));
    
    [key getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
        
    NSUInteger dataLength = [data length];
    
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    
    void *buffer = malloc(bufferSize);
    
    size_t numBytesCrypted = 0;
    
    CCCryptorStatus cryptStatus;
    
    if (operation == kCCEncrypt) {
        int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
        
        NSInteger newSize = 0;
            
        if(diff > 0) {
            newSize = dataLength + diff;
        }
        
        char dataPtr[newSize];
        
        memcpy(dataPtr, [data bytes], dataLength);
        
        for(int i = 0; i < diff; i++) {
            dataPtr[i + dataLength] = 0x00;
        }
    
        memset(buffer, 0, bufferSize);
        
        cryptStatus = CCCrypt(operation,
                              kCCAlgorithmAES128,
                              0x0000,               //No padding
                              keyPtr,
                              kCCKeySizeAES128,
                              ivPtr,
                              dataPtr,
                              sizeof(dataPtr),
                              buffer,
                              bufferSize,
                              &numBytesCrypted);
    }else {
        cryptStatus = CCCrypt(operation,
                              kCCAlgorithmAES128,
                              0x0000,
                              keyPtr,
                              kCCBlockSizeAES128,
                              ivPtr,
                              [data bytes],
                              dataLength,
                              buffer,
                              bufferSize,
                              &numBytesCrypted);
    }
    
    if (cryptStatus == kCCSuccess) {
        NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
                
        return resultData;
    }
    
    free(buffer);
    
    return nil;
}
// MARK: ===============加密===============
+ (NSString *)encryptAES:(NSString *)content {
    NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
    
    return [[AESEncryptTool CCCryptWithOptration:kCCEncrypt Data:data] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
}
// MARK: ===============解密===============
+ (NSString *)decryptAES:(NSString *)content {
    NSData *data = [[NSData alloc]initWithBase64EncodedString:content options:NSDataBase64DecodingIgnoreUnknownCharacters];
    
    return [[NSString alloc]initWithData:[AESEncryptTool CCCryptWithOptration:kCCDecrypt Data:data] encoding:NSUTF8StringEncoding];
}
+ (NSData *)CCCryptWithOptration:(CCOperation)operation Data:(NSData *)data {
    char keyPtr[kCCKeySizeAES256 + 1];
    
    bzero(keyPtr, sizeof(keyPtr));
    
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    // IV
    char ivPtr[kCCBlockSizeAES128 + 1];
    
    bzero(ivPtr, sizeof(ivPtr));
    
    [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    
    size_t bufferSize = data.length + kCCBlockSizeAES128;
    
    void *buffer = malloc(bufferSize);
    
    size_t actualOutSize = 0;
    
    CCCryptorStatus cryptorStatus = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr, kCCKeySizeAES256, ivPtr, data.bytes, data.length, buffer, bufferSize, &actualOutSize);
    
    if(cryptorStatus == kCCSuccess){
        NSData *data = [NSData dataWithBytesNoCopy:buffer length:actualOutSize];
        
        return data;
    }
    
    free(buffer);
    
    return nil;
}


@end




// h文件
//
//  AESEncryptTool.h
//  太公管工
//
//  Created by 李松 on 2021/9/11.
//  Copyright © 2021 姜太公. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCryptor.h>
#import <CommonCrypto/CommonDigest.h>

NS_ASSUME_NONNULL_BEGIN

@interface AESEncryptTool : NSObject

// MARK: ===============加密===============
+ (NSString *)AES256Encrypt:(NSString *)content Key:(NSString *)key;
// MARK: ===============解密===============
+ (NSString *)AES256Decrypt:(NSString *)content Key:(NSString *)key;
// MARK: ===============加密===============
+ (NSString *)AES128Encrypt:(NSString *)content Key:(NSString *)key;
// MARK: ===============解密===============
+ (NSString *)AES128Decrypt:(NSString *)content Key:(NSString *)key;
// MARK: ===============加密===============
+ (NSString *)encryptAES:(NSString *)content;
// MARK: ===============解密===============
+ (NSString *)decryptAES:(NSString *)content;


@end

NS_ASSUME_NONNULL_END

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值