关于iOS开发中使用到的AES加密和SHA256加密的使用
**
笔者在前段时间就这个问题跟后台的人对接了很久,最后终于确定问题是我们的加密方式虽然都为同一种,但却存在本质的区别。下面我简单描述下区别,并附上主要代码:
1. 常用AES加密说明
我们在开发中常用的AES为AES128和AES256,两者的区别在于256补码方式更加安全一点,按照一个字节为八位,采用的加密keyAES128为128/8=16位,AES256为256/8=32位,说到这里,需要注意一个参数:kCCOptionPKCS7Padding,这里java那里有多少种笔者没研究过,但是知道有另外一个叫:kCCOptionPKCS5Padding,但是iOS只有一种,也就是上面的所说的kCCOptionPKCS7Padding,那这怎么办呢?这里说下加密的key,这个参数跟加密key有关,上面有提到,AES128为16位加密key,AES256为32位加密key,正常来说,只要key满足这个要求,不管你用kCCOptionPKCS7Padding还是kCCOptionPKCS5Padding都是没区别的,但是当key少于这个数的时候,就需要进行补码了,这样区别就出来了,kCCOptionPKCS7Padding是缺几位,就补几个几,如:缺3位,补3个3,缺5位,补5个5,kCCOptionPKCS5Padding是缺几位就补几个0,如:缺3位,就补3个0.在使用中还有一个参数可以设置,iv向量,这个都是要自己设定的,也可不做设置,感兴趣的朋友可以自己去了解下iv向量,这里不做过多说明。
下面附上AES256和AES128加密代码片段供参考:
- (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); return nil; }
- (NSData *)AES128EncryptWithKey:(NSString *)key {//加密 char keyPtr[kCCKeySizeAES128+1]; bzero(keyPtr, sizeof(keyPtr)); [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; char ivPtr[kCCKeySizeAES128+1]; memset(ivPtr, 0, sizeof(ivPtr)); [gIv getCString:ivPtr maxLength:sizeof(ivPtr) 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, ivPtr, [self bytes], dataLength, buffer, bufferSize, &numBytesEncrypted); if (cryptStatus == kCCSuccess) { return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; } free(buffer); return nil; }
可以看到AES128有个iv向量,可手动设置。
2.下面来说下SHA256加密,这个相对于AES加密就简单很多了,百度上也有很多,但是笔者在使用的时候,从网上复制的代码,被坑的不轻,分明是SHA256,结果成了SHA的其他加密结果,看了下代码才知道原来网上的写错了,这里仅附上SHA256的代码,不多作说明。
//sha256加密方式 - (NSString *)getSha256String:(NSString *)srcString { const char *cstr = [srcString cStringUsingEncoding:NSUTF8StringEncoding]; NSData *data = [NSData dataWithBytes:cstr length:srcString.length]; uint8_t digest[CC_SHA256_DIGEST_LENGTH]; CC_SHA256(data.bytes, data.length, digest); NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) { [result appendFormat:@"%02x", digest[i]]; } return result; }
从上述代码可以看到里面有256字样,至于SHA的其他加密方式则是直接把参数替换为对应的数字就行了,有兴趣的朋友可以在使用中自己试试。
第一次发博客,有写的不好的,还请见谅。