谈谈iOS中 AES128 +ECB +NoPadding

项目开发过程中,经常会使用各种加密手段来保证数据的安全性,常见的有MD5,DES,AES等等。摘取百度百科AES词条的简介:AES即高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

加密方式无非是由三部分组成,“算法——模式——填充”,ios中常用是AES128加密,CBC模式,kCCOptionPKCS7Padding填充方式,按照从网上查阅的资料来看,如果切换成ECB模式,仅需要将kCCOptionPKCS7Padding替换为kCCOptionPKCS7Padding|kCCOptionECBMode,并且偏移量IV字段传空即可,但如果你需要的是AES128+ECB+无填充模式,那么需要将填充字段改为0x0000,因为在 No Pading的情况下,一定要对加密数据不是kCCKeySizeAES128倍数部分进行0x0000的填充,不然加密长度不正确,而ios中一般情况下选择使用kCCOptionPKCS7Padding(也就是0x0001)进行填充,但是我们是No Padding所以要自己用0x0000填充。

//加密
+ (NSString *)AES128ECBNoPaddingEncrypt:(NSString *)plainText key:(NSString *)key
{
    char keyPtr[kCCKeySizeAES256+1];
       memset(keyPtr, 0, sizeof(keyPtr));
       [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
       
//       char ivPtr[kCCBlockSizeAES128+1];
//       memset(ivPtr, 0, sizeof(ivPtr));
//       [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
       
       NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
       NSUInteger dataLength = [data length];
       
       int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
       int newSize = 0;
       
       if(diff > 0)
       {
           newSize = dataLength + diff;
       }
       
       char dataPtr[newSize];
       memcpy(dataPtr, [data bytes], [data length]);
       for(int i = 0; i < diff; i++)
       {
           dataPtr[i + dataLength] = 0x00;
       }
       
       size_t bufferSize = newSize + kCCBlockSizeAES128;
       void *buffer = malloc(bufferSize);
       memset(buffer, 0, bufferSize);
       
       size_t numBytesCrypted = 0;
       
       CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                             kCCAlgorithmAES128,
                                             0x0000              //No padding
                                             keyPtr,
                                             kCCKeySizeAES256,
                                             NULL,
                                             dataPtr,
                                             sizeof(dataPtr),
                                             buffer,
                                             bufferSize,
                                             &numBytesCrypted);
       
       if (cryptStatus == kCCSuccess) {
           NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
           return [self hexStringFromData:resultData];
       }
       free(buffer);

        return nil;
}
// 普通字符串转换为十六进
+ (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进制数
        newHexStr = [newHexStr uppercaseString];
        
        if([newHexStr length] == 1) {
            newHexStr = [NSString stringWithFormat:@"0%@",newHexStr];
        }
        
        hexStr = [hexStr stringByAppendingString:newHexStr];
        
    }
    hexStr = [hexStr lowercaseString];
    return hexStr;
}

你可能感兴趣的:(谈谈iOS中 AES128 +ECB +NoPadding)