zoukankan      html  css  js  c++  java
  • AES加密算法

    AES已然成为对称密钥加密中最流行的算法之一
    高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法

    需要注意的是,AES并不能作为HASH算法,加密并解密后的结果,并不一定与原文相同,使用时请注意进行结果验算。例如解密原文的长度,格式规则等。 NG实例

    Objective-cAES加密和解密算法的具体实现代码如下: 1.拓展NSData,增加AES256加密方法

    ////NSData+AES256.h//#import <Foundation/Foundation.h>#import <CommonCrypto/CommonDigest.h>#import <CommonCrypto/CommonCryptor.h>@interfaceNSData(AES256)-(NSData*) aes256_encrypt:(NSString*)key;

    -(NSData*) aes256_decrypt:(NSString*)key;

    @end////NSData+AES256.m//#import "NSData+AES256.h"@implementationNSData(AES256)-(NSData*)aes256_encrypt:(NSString*)key   //加密{char keyPtr[kCCKeySizeAES256+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 | kCCOptionECBMode,

                          keyPtr, kCCBlockSizeAES128,

                          NULL,

                          [self bytes], dataLength,

                          buffer, bufferSize,

                          &numBytesEncrypted);

      if(cryptStatus == kCCSuccess){return[NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

      }free(buffer);

      returnnil;

    }-(NSData*)aes256_decrypt:(NSString*)key   //解密{char keyPtr[kCCKeySizeAES256+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 | kCCOptionECBMode,

                          keyPtr, kCCBlockSizeAES128,

                          NULL,

                          [self bytes], dataLength,

                          buffer, bufferSize,

                          &numBytesDecrypted);

      if(cryptStatus == kCCSuccess){return[NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

     

      }free(buffer);

      returnnil;

    }@end

    2.拓展NSString,增加AES256加密方法,需要导入NSData+AES256.h

    ////NSString +AES256.h//#import <Foundation/Foundation.h>#import <CommonCrypto/CommonDigest.h>#import <CommonCrypto/CommonCryptor.h>#import"NSData+AES256.h"@interfaceNSString(AES256)-(NSString*) aes256_encrypt:(NSString*)key;

    -(NSString*) aes256_decrypt:(NSString*)key;

     

    @end////NSString +AES256.h//@implementationNSString(AES256)-(NSString*) aes256_encrypt:(NSString*)key

    {constchar*cstr =[self cStringUsingEncoding:NSUTF8StringEncoding];

      NSData*data =[NSData dataWithBytes:cstr length:self.length];

      //对数据进行加密NSData*result =[data aes256_encrypt:key];

     

      //转换为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;

      }returnnil;

    }-(NSString*) aes256_decrypt:(NSString*)key

    {//转换为2进制DataNSMutableData*data =[NSMutableData dataWithCapacity:self.length /2];

      unsignedchar 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 aes256_decrypt:key];

      if(result && result.length > 0){return[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding]autorelease];

      }returnnil;

    }@end

  • 相关阅读:
    二分使用条件 + 代码模板
    Codeforces Round #710 (Div. 3) Editorial 1506A
    Cf #709 Div. 2 B. Restore Modulo 一个只有三千多人过的b题, 妙啊!
    牛客网 第十八届浙大城市学院程序设计竞赛(同步赛)J--万万没想到 啦啦啦啦啦
    Codeforces Round #707 (Div. 2)A.英语漏洞 + C.Going Home C题收获不小
    Codeforces Round #706 (Div. 2)B. Max and Mex __ 思维, 模拟
    Codeforces Round #705 (Div. 2) B. Planet Lapituletti(镜像时钟) 思维
    位运算
    Edu Cf Round 105 (Div. 2) B. Berland Crossword 1.读懂题, 2. 思维
    Codeforces Round #703 (Div. 2)__ B. Eastern Exhibition__ 纯纯的思维
  • 原文地址:https://www.cnblogs.com/GhostKZShadow/p/5099702.html
Copyright © 2011-2022 走看看