zoukankan      html  css  js  c++  java
  • IOS开发之数据加密与解密:AES256+Base64转码

    AES:高级加密标准(Advanced Encryption Standard)。在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

    以上来自百度百科。

    本篇采用代码的方式阐述加密方法。

    加密步骤:字符串经过AES加密得到NSData类型,然后在对加密后的NSData类型进行Base64转码,得出最终的字符串

    解密步骤:对要解密的字符串进行Base64解码,然后进行解密,得出原字符串

    首先创建一个基于NSObject的AESUtility类,,写完的.h文件如下:

    #import <Foundation/Foundation.h>
    
    @interface AESUtility : NSObject
    
    + (NSString *)EncryptString:(NSString *)sourceStr;
    
    + (NSString *)DecryptString:(NSString *)secretStr;
    
    @end
    

     .m文件导入相应的头文件并且实现这两个方

    #import "AESUtility.h"
    
    #import <CommonCrypto/CommonDigest.h>
    #import <CommonCrypto/CommonCryptor.h>
    
    //加密与解密的秘钥,需要与后台协商共同定义,保持与后台的秘钥相同
    static NSString *key = @"12345678";
    
    @implementation AESUtility
    
    + (NSString *)EncryptString:(NSString *)sourceStr
    {
        char keyPtr[kCCKeySizeAES256 + 1];
        bzero(keyPtr, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
        
        NSData *sourceData = [sourceStr dataUsingEncoding:NSUTF8StringEncoding];
        NSUInteger dataLength = [sourceData length];
        size_t buffersize = dataLength + kCCBlockSizeAES128;
        void *buffer = malloc(buffersize);
        size_t numBytesEncrypted = 0;
        CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, [sourceData bytes], dataLength, buffer, buffersize, &numBytesEncrypted);
        
        if (cryptStatus == kCCSuccess) {
            NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
            //对加密后的二进制数据进行base64转码
            return [encryptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
        }
        else
        {
            free(buffer);
            return nil;
        }
    }
    
    + (NSString *)DecryptString:(NSString *)secretStr
    {
        //先对加密的字符串进行base64解码
        NSData *decodeData = [[NSData alloc] initWithBase64EncodedString:secretStr options:NSDataBase64DecodingIgnoreUnknownCharacters];
        
        char keyPtr[kCCKeySizeAES256 + 1];
        bzero(keyPtr, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
        
        NSUInteger dataLength = [decodeData length];
        size_t bufferSize = dataLength + kCCBlockSizeAES128;
        void *buffer = malloc(bufferSize);
        size_t numBytesDecrypted = 0;
        CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, [decodeData bytes], dataLength, buffer, bufferSize, &numBytesDecrypted);
        if (cryptStatus == kCCSuccess) {
            NSData *data = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
            NSString *result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            return result;
        }
        else
        {
            free(buffer);
            return nil;
        }
    }
    @end
  • 相关阅读:
    springmvc跨域+token验证(app后台框架搭建二)
    JSON Web Tokens(JWT)
    spring4+springmvc+mybatis基本框架(app后台框架搭建一)
    [原创] zabbix学习之旅一:源码安装
    ROC 曲线和 AUC 值
    win7 64位系统 Oracle32bit + PL/SQL访问Orale服务,Oracle 11g的安装,中文乱码问题的解决
    CentOS系统安装配置mysql
    Loaded plugins: fastestmirror, refresh-packagekit, security
    求LCA最近公共祖先的离线Tarjan算法_C++
    求LCA最近公共祖先的在线ST算法_C++
  • 原文地址:https://www.cnblogs.com/csdnmc/p/5391965.html
Copyright © 2011-2022 走看看