• iOS AES的加密解密


    主要是要得到加密后的原来的字符创,MD5无法得到原有的,仅仅能用AES+base64

    要用GTMBase64这个能够自己去下载,

    主要看另外2个类文件。

    #import <Foundation/Foundation.h>
    @class NSString;
    @interface NSData (NSData_AES)
    
    - (NSData *)AES128EncryptWithKey:(NSString *)key;   //加密
    - (NSData *)AES128DecryptWithKey:(NSString *)key;   //解密
    
    @end

    #import "NSData+NSData_AES.h"
    #import <CommonCrypto/CommonCryptor.h>
    #define gIv @"xxxxxxxxxxx" //能够自行定义16位
    
    @implementation NSData (NSData_AES)
    //(key和iv向量这里是16位的) 这里是CBC加密模式,安全性更高
    
    - (NSData *)AES128EncryptWithKey:(NSString *)key//加密
    {
        char keyPtr[kCCKeySizeAES128+1];
        bzero(keyPtr, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
        
        char ivPtr[kCCKeySizeAES128+1];
        memset(ivPtr, 0, sizeof(ivPtr));
        [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
        
        NSUInteger dataLength = [self length];
        size_t bufferSize = dataLength + kCCBlockSizeAES128;
        void *buffer = malloc(bufferSize);
        size_t numBytesEncrypted = 0;
        CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                              kCCAlgorithmAES128,
                                              kCCOptionPKCS7Padding,
                                              keyPtr,
                                              kCCBlockSizeAES128,
                                              ivPtr,
                                              [self bytes],
                                              dataLength,
                                              buffer,
                                              bufferSize,
                                              &numBytesEncrypted);
        if (cryptStatus == kCCSuccess) {
            return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        }
        free(buffer);
        return nil;
    }
    
    
    - (NSData *)AES128DecryptWithKey:(NSString *)key//解密
    {
        char keyPtr[kCCKeySizeAES128+1];
        bzero(keyPtr, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
        
        char ivPtr[kCCKeySizeAES128+1];
        memset(ivPtr, 0, sizeof(ivPtr));
        [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
        
        NSUInteger dataLength = [self length];
        size_t bufferSize = dataLength + kCCBlockSizeAES128;
        void *buffer = malloc(bufferSize);
        size_t numBytesDecrypted = 0;
        CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                              kCCAlgorithmAES128,
                                              kCCOptionPKCS7Padding,
                                              keyPtr,
                                              kCCBlockSizeAES128,
                                              ivPtr,
                                              [self bytes],
                                              dataLength,
                                              buffer,
                                              bufferSize,
                                              &numBytesDecrypted);
        if (cryptStatus == kCCSuccess) {
            return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
        }
        free(buffer);
        return nil;
    }
    
    @end
    


    #import <Foundation/Foundation.h>
    
    @interface SecurityUtil : NSObject 
    
    #pragma mark - base64
    + (NSString*)encodeBase64String:(NSString *)input;
    + (NSString*)decodeBase64String:(NSString *)input;
    
    + (NSString*)encodeBase64Data:(NSData *)data;
    + (NSString*)decodeBase64Data:(NSData *)data;
    
    #pragma mark - AES加密
    //将string转成带password的data
    + (NSString*)encryptAESData:(NSString*)string app_key:(NSString*)key ;
    //将带password的data转成string
    +(NSString*)decryptAESData:(NSData*)data app_key:(NSString*)key ;
    
    
    @end

    #import "SecurityUtil.h"
    #import "GTMBase64.h"
    #import "NSData+AES.h"
    
    
    @implementation SecurityUtil
    
    #pragma mark - base64
    + (NSString*)encodeBase64String:(NSString * )input { 
        NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 
        data = [GTMBase64 encodeData:data]; 
        NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; 
    	return base64String;
    }
    
    + (NSString*)decodeBase64String:(NSString * )input { 
        NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; 
        data = [GTMBase64 decodeData:data]; 
        NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; 
    	return base64String;
    } 
    
    + (NSString*)encodeBase64Data:(NSData *)data {
    	data = [GTMBase64 encodeData:data]; 
        NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
    	return base64String;
    }
    
    + (NSString*)decodeBase64Data:(NSData *)data {
    	data = [GTMBase64 decodeData:data]; 
        NSString *base64String = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
    	return base64String;
    }
    
    #pragma mark - AES加密
    //将string转成带password的data
    +(NSString*)encryptAESData:(NSString*)string app_key:(NSString*)key
    {
        //将nsstring转化为nsdata
        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
        //使用password对nsdata进行加密
        NSData *encryptedData = [data AES128EncryptWithKey:key];
        NSLog(@"加密后的字符串 :%@",[encryptedData base64Encoding]);
        
        return [encryptedData base64Encoding];
    }
    
    #pragma mark - AES解密
    //将带password的data转成string
    +(NSString*)decryptAESData:(NSData*)data  app_key:(NSString*)key
    {
        //使用password对data进行解密
        NSData *decryData = [data AES128DecryptWithKey:key];
        //将解了password的nsdata转化为nsstring
        NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding];
        NSLog(@"解密后的字符串 :%@",str);
        return [str autorelease];
    }
    
    @end


    详细的用法例如以下:

    加密:

    [SecurityUtilencryptAESData:@"XXXXXX" app_key:KEY]; 这里的是能够自己设置一个16位的字符串

    解密:

    NSData *EncryptData1 = [GTMBase64decodeString:[SecurityUtil encryptAESData:@"XXXXXX" app_key:KEY]];//解密前进行GTMBase64编码

    NSString * string1 = [SecurityUtildecryptAESData:EncryptData1app_key:KEY];


  • 相关阅读:
    【2021-08-25】连岳摘抄
    【2021-08-24】对意义的过度扭曲
    【2021-08-23】枕边语
    【2021-08-22】连岳摘抄
    【2021-08-21】旅历尚浅
    【2021-08-20】做事情,等对应好角色去思考
    索引缓冲对象(EBO或IBO )的理解
    vao, vbo的一点拙见
    兔队线段树
    「具体数学」二:和式
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6958746.html
Copyright © 2020-2023  润新知