• AES 加解密


    //
    //  NSData+AES.h
    //  Smile
    //
    //  Created by 蒲晓涛 on 12-11-24.
    //  Copyright (c) 2012年 BOX. All rights reserved.
    //
    
    // 版权属于原作者
    // http://code4app.com (cn) http://code4app.net (en)
    // 发布代码于最专业的源码分享网站: Code4App.com
    
    #import <Foundation/Foundation.h>
    
    @class NSString;
    
    @interface NSData (Encryption)
    
    - (NSData *)AES128EncryptWithKey:(NSString *)key;   //加密
    - (NSData *)AES128DecryptWithKey:(NSString *)key;   //解密
    
    @end
    //
    //  NSData+AES.h
    //  Smile
    //
    //  Created by 蒲晓涛 on 12-11-24.
    //  Copyright (c) 2012年 BOX. All rights reserved.
    //
    
    // 版权属于原作者
    // http://code4app.com (cn) http://code4app.net (en)
    // 发布代码于最专业的源码分享网站: Code4App.com
    
    #import "NSData+AES.h"
    #import <CommonCrypto/CommonCryptor.h>
    
    #define gIv          @"205681D89D731A8F" //可以自行修改
    
    @implementation NSData (Encryption)
    
    //(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

    //
    //  SecurityUtil.h
    //  Smile
    //
    //  Created by 蒲晓涛 on 12-11-24.
    //  Copyright (c) 2012年 BOX. All rights reserved.
    //
    
    // 版权属于原作者
    // http://code4app.com (cn) http://code4app.net (en)
    // 发布代码于最专业的源码分享网站: Code4App.com
    
    #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转成带密码的data
    //加密后16进制输出
    +(NSString*)encryptAESDataToHexString:(NSString*)string app_key:(NSString*)key ;
    
    //加密后base64输出
    +(NSString*)encryptAESDataToBase64:(NSString*)string app_key:(NSString*)key;
    
    //将带密码的data转成string
    //解密base64
    +(NSString*)decryptAESStringFromBase64:(NSString *)string  app_key:(NSString*)key;
    
    //解密16进制
    +(NSString*)decryptAESStringFromHexString:(NSString *)string  app_key:(NSString*)key;
    
    @end
    
    
    //
    //  SecurityUtil.h
    //  Smile
    //
    //  Created by 蒲晓涛 on 12-11-24.
    //  Copyright (c) 2012年 BOX. All rights reserved.
    //
    
    // 版权属于原作者
    // http://code4app.com (cn) http://code4app.net (en)
    // 发布代码于最专业的源码分享网站: Code4App.com
    
    #import "SecurityUtil.h"
    #import "GTMBase64.h"
    #import "NSData+AES.h"
    
    #define C2I(c) ((c >= '0' && c<='9') ? (c-'0') : ((c >= 'a' && c <= 'z') ? (c - 'a' + 10): ((c >= 'A' && c <= 'Z')?(c - 'A' + 10):(-1))))
    @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];
        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];
        return base64String;
    } 
    
    + (NSString*)encodeBase64Data:(NSData *)data {
        data = [GTMBase64 encodeData:data]; 
        NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        return base64String;
    }
    
    + (NSString*)decodeBase64Data:(NSData *)data {
        data = [GTMBase64 decodeData:data]; 
        NSString *base64String = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        return base64String;
    }
    
    #pragma mark - AES加密
    //将string转成带密码的data
    +(NSString*)encryptAESDataToHexString:(NSString*)string app_key:(NSString*)key
    {
        //将nsstring转化为nsdata
        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
        NSData *encryptedData = [data AES128EncryptWithKey:key];
        Byte *bytes = (Byte *)[encryptedData bytes];
        NSLog(@"%@", encryptedData);
        //下面是Byte 转换为16进制。
        NSString *hexStr=@"";
        for(int i=0;i<[encryptedData length];i++)
            
        {
            NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数
            
            if([newHexStr length]==1)
                
                hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
            
            else
                
                hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
        }
        NSLog(@"%@", hexStr);
        NSLog(@"%@", hexStr.uppercaseString);
        return hexStr.uppercaseString;
    }
    
    +(NSString*)encryptAESDataToBase64:(NSString*)string app_key:(NSString*)key
    {
        //将nsstring转化为nsdata
        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
        NSData *encryptedData = [data AES128EncryptWithKey:key];
        Byte *bytes = (Byte *)[encryptedData bytes];
        NSLog(@"%@", encryptedData);
        NSLog(@"加密后的字符串 :%@",[encryptedData base64Encoding]);
        
        return [encryptedData base64Encoding];
    }
    
    #pragma mark - 转16进制
    -(NSString *)hexStringFromData:(NSData *)data{
        Byte *bytes = (Byte *)[data bytes];
        //下面是Byte 转换为16进制。
        NSString *hexStr=@"";
        for(int i=0;i<[data length];i++)
            
        {
            NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数
            
            if([newHexStr length]==1)
                
                hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
            
            else
                
                hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
        }
        return hexStr;
    }
    
    
    #pragma mark - 16进制转data
    -(NSData *)convert:(NSString *)str
    
    {
        
        const char* cs = str.UTF8String;
        
        int count = strlen(cs);
        
        int8_t bytes[count / 2];
        
        for(int i = 0; i<count; i+=2)
        {
            char c1 = *(cs + i);
            char c2 = *(cs + i + 1);
            if(C2I(c1) >= 0 && C2I(c2) >= 0){
                bytes[i / 2] = C2I(c1) * 16 + C2I(c2);
            }else{
                return nil;
            }
        }
        return [NSData dataWithBytes:bytes length:count / 2];
    }
    
    #pragma mark - AES解密
    //将带密码的data转成string
    +(NSString*)decryptAESStringFromBase64:(NSString *)string  app_key:(NSString*)key
    {
        NSData *EncryptData = [GTMBase64 decodeString:string]; //解密前进行GTMBase64编码
        //使用密码对data进行解密
        NSData *decryData = [EncryptData AES128DecryptWithKey:key];
        //将解了密码的nsdata转化为nsstring
        NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding];
        return str;
    }
    //--------------------------------------------------------
    +(NSString*)decryptAESStringFromHexString:(NSString *)string  app_key:(NSString*)key
    {
        //16进制转data
        const char* cs = string.UTF8String;
        
        int count = strlen(cs);
        
        int8_t bytes[count / 2];
        
        for(int i = 0; i<count; i+=2)
        {
            char c1 = *(cs + i);
            char c2 = *(cs + i + 1);
            if(C2I(c1) >= 0 && C2I(c2) >= 0){
                bytes[i / 2] = C2I(c1) * 16 + C2I(c2);
            }else{
                return nil;
            }
        }
        NSData * newData = [NSData dataWithBytes:bytes length:count / 2];
        NSLog(@"%@", newData);
        //NSData *EncryptData = [GTMBase64 decodeString:string]; //解密前进行GTMBase64编码
        //使用密码对data进行解密
        NSData *decryData = [newData AES128DecryptWithKey:key];
        //将解了密码的nsdata转化为nsstring
        NSString *str = [[NSString alloc] initWithData:decryData encoding:NSUTF8StringEncoding];
        return str;
    }
    
    @end
     
  • 相关阅读:
    vs编译错误error C2059 由extern "C"导致的错误处理
    原生JS:响应式轮播图
    JSP用户关注取关实现
    JSP和AJAX实现登录注册
    MySQL常用命令
    offsetWidth/getBoundingRect()/scrollWidth/client用法总结
    画廊相册—原生JavaScript实现
    《JavaScript DOM 编程艺术》读书笔记
    天猫网页前端实现
    Docker安装和配置(链接集合)
  • 原文地址:https://www.cnblogs.com/ningmengcao-ios/p/5727989.html
Copyright © 2020-2023  润新知