• AES128_CBC模式加密


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

    1.字符串加密(http://www.seacha.com/tools/aes.html)

      原始字符串:SuperDo.Team
      加密后字符串:f3de96947b786e45fe338f06e2baeb2a

    2.字符串解密(iOS)

      [1].对NSData进行拓展

      NSData+AES128.h

    @interface NSData (AES128)
    - (NSData *)AES128_encrypt:(NSString *)key padding:(NSString *)pad;;
    - (NSData *)AES128_decrypt:(NSString *)key padding:(NSString *)pad;;
    @end
    

      NSData+AES128.m

    #import "NSData+AES128.h"
    
    @implementation NSData (AES128)
    - (NSData *)AES128_encrypt:(NSString *)key padding:(NSString *)pad;   //加密
    {
        char keyPtr[kCCKeySizeAES128+1];
        bzero(keyPtr, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) 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,
                                              [pad UTF8String],
                                              [self bytes], dataLength,
                                              buffer, bufferSize,
                                              &numBytesEncrypted);
        if (cryptStatus == kCCSuccess) {
            return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        }
        free(buffer);
        return nil;
    }
    
    - (NSData *)AES128_decrypt:(NSString *)key padding:(NSString *)pad;  //解密
    {
        char keyPtr[kCCKeySizeAES128+1];
        bzero(keyPtr, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) 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,
                                              [pad UTF8String],
                                              [self bytes], dataLength,
                                              buffer, bufferSize,
                                              &numBytesDecrypted);
        if (cryptStatus == kCCSuccess) {
            return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
            
        }
        free(buffer);
        return nil;
    }
    
    @end
    

      [2].对NSString进行拓展

      NSString+AES128.h

    #import <Foundation/Foundation.h>
    #import <CommonCrypto/CommonCryptor.h>
    
    @interface NSString (AES128)
    
    -(NSString *) AES128_decrypt:(NSString *)key padding:(NSString *)pad;
    -(NSString *) AES128_encrypt:(NSString *)key padding:(NSString *)pad;;
    @end
    

      NSString+AES128.m

    #import "NSString+AES128.h"
    #import "NSData+AES128.h"
    
    @implementation NSString (AES128)
    -(NSString *) AES128_encrypt:(NSString *)key padding:(NSString *)pad;
    {
        const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
        NSData *data = [NSData dataWithBytes:cstr length:self.length];
        //对数据进行加密
        NSData *result = [data AES128_encrypt:key padding:pad];
        
        //转换为2进制字符串
        if (result && result.length > 0) {
            
            Byte *datas = (Byte*)[result bytes];
            NSMutableString *output = [NSMutableString stringWithCapacity:result.length * 2];
            for(int i = 0; i < result.length; i++){
                [output appendFormat:@"%02x", datas[i]];
            }
            return output;
        }
        return nil;
    }
    
    -(NSString *) AES128_decrypt:(NSString *)key padding:(NSString *)pad;
    {
        //转换为2进制Data
        NSMutableData *data = [NSMutableData dataWithCapacity:self.length / 2];
        unsigned char whole_byte;
        char byte_chars[3] = {'','',''};
        int i;
        for (i=0; i < [self length] / 2; i++) {
            byte_chars[0] = [self characterAtIndex:i*2];
            byte_chars[1] = [self characterAtIndex:i*2+1];
            whole_byte = strtol(byte_chars, NULL, 16);
            [data appendBytes:&whole_byte length:1];
        }
        
        //对数据进行解密
        NSData* result = [data AES128_decrypt:key padding:pad];
        if (result && result.length > 0) {
            return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
        }
        return nil;
    }
    @end

    3.验证

      main.m

    #import <Foundation/Foundation.h>
    #import "NSString+AES128.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
            NSLog(@"Hello, World!");
            NSString *str = [@"f3de96947b786e45fe338f06e2baeb2a" AES128_decrypt:@"123456" padding:@"8888888877777777"];
            NSLog(@"%@",str);
        }
        return 0;
    }
    

      验证结果:
      2016-01-18 19:27:48.703 AES_128_CBC[30636:2351517] Hello, World!
      2016-01-18 19:27:48.704 AES_128_CBC[30636:2351517] SuperDo.Team
      Program ended with exit code: 0

      完美的搞定AES128_CBC模式加密了!

     

    本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 
    转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/5140243.html

     

  • 相关阅读:
    洛谷P2158 [SDOI2008]仪仗队 欧拉函数的应用
    leetcode 130. 被围绕的区域 DFS
    TediousLee CodeForces
    AccurateLee双指针+贪心+字符串
    leetcode80. 删除排序数组中的重复项 II
    CHFDORA:哆啦 A 梦
    cdq分治浅谈
    leetcode面试题64. 求1+2+…+n
    leetcode84. 柱状图中最大的矩形
    leetcode874. 模拟行走机器人
  • 原文地址:https://www.cnblogs.com/superdo/p/5140243.html
Copyright © 2020-2023  润新知