**
关于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的其他加密方式则是直接把参数替换为对应的数字就行了,有兴趣的朋友可以在使用中自己试试。
第一次发博客,有写的不好的,还请见谅。