• 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

  • 相关阅读:
    GMA Round 1 数列求单项
    GMA Round 1 双曲线与面积
    多线程环境中安全使用集合API(含代码)
    使用synchronized获取互斥锁的几点说明
    ThreadPoolExecutor线程池
    线程状态转换
    volatile关键字
    守护线程与线程阻塞的四种情况
    线程挂起,恢复与终止
    线程中断
  • 原文地址:https://www.cnblogs.com/GhostKZShadow/p/5099702.html
Copyright © 2020-2023  润新知