** 關於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的其他加密方式則是直接把參數替換為對應的數字就行了,有興趣的朋友可以在使用中自己試試。
第一次發部落格,有寫的不好的,還請見諒。