接基礎篇(1),再來說下AES。
一、AES加密算法
1.度娘說:高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高級加密標準由美國國家標準與技術研究院(NIST)于2001年11月26日發布于FIPS PUB 197,并在2002年5月26日成為有效的標準。2006年,高級加密標準已然成為對稱密鑰加密中最流行的算法之一。具體加密原理就不去細究了直接從應用層說起。有興趣了解加密解密原理的可以參考一下:http://www.mamicode.com/info-detail-514466.html
2.應用場景
1.AES是一種對稱加密算法,采用單鑰密碼系統的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密。優點是算法公開、計算量小、加密速度快、加密效率高。缺點是在數據傳送前,發送方和接收方必須商定好秘鑰,然后使雙方都能保存好秘鑰。其次如果一方的秘鑰被泄露,那么加密信息也就不安全了。另外,每對用戶每次使用對稱加密算法時,都需要使用其他人不知道的唯一秘鑰,這會使得收、發雙方所擁有的鑰匙數量巨大,密鑰管理成為雙方的負擔。
</br>
2.一般應用是配合Base64對長文本進行加密或是對字符串進行加密,已保證數據和文本在傳輸過程中不被別人攔截明文查看,我們項目中的應用就是對所有的文本文件進行加密,防止別人直接拿到我們存在本地的文件就能直接查看了。
3.算法
1.一般AES采用128位或是256位加密算法,就是秘鑰字符位數一個是16位一個是32位。我們采用的是256的。
2.加密算法:
- (NSData *)AES256EncryptWithKey:(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 + 100;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCKeySizeAES256,
NULL,
[self bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess)
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
// 將加密的二進制轉化成16進制字符
- (NSString *)AES256EncryptWithKeyString:(NSString *)key
{
// NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
NSData *decry = [self AES256EncryptWithKey:key];
NSString *descryStr = [[NSString alloc] initWithData:decry encoding:NSUTF8StringEncoding];
return descryStr;
}
3.解密算法
- (NSData *)AES256DecryptWithKey:(NSString *)key //解密
{
char keyPtr[kCCKeySizeAES256 + 1];
bzero(keyPtr, sizeof(keyPtr));
BOOL suc = [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
if (!suc) return [NSData data];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + 100;
void *buffer = malloc(bufferSize);
// size_t numBytesEncrypted = 0;
//同理,解密中,密鑰也是32位的
// const void *keyPtr2 = [key bytes];
// char (*keyPtr)[32] = keyPtr2;
//
// //對于塊加密算法,輸出大小總是等于或小于輸入大小加上一個塊的大小
// //所以在下邊需要再加上一個塊的大小
// NSUInteger dataLength = [self length];
// size_t bufferSize = dataLength + 32;
// void *buffer = malloc(bufferSize);
//
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES,
kCCOptionPKCS7Padding/*這里就是剛才說到的PKCS7Padding填充了*/ | kCCOptionECBMode,
keyPtr, kCCKeySizeAES256,
NULL,/* 初始化向量(可選) */
[self bytes], dataLength,/* 輸入 */
buffer, bufferSize,/* 輸出 */
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer);
return nil;
}
// 將解密的二進制轉換成字符
- (NSString *)AES256DecryptWithKeyString:(NSString *)key
{
if(self){
NSData *decry = [self AES256DecryptWithKey:key];
NSString *descryStr = [[NSString alloc] initWithData:decry encoding:NSUTF8StringEncoding];
return descryStr;
}
else{
return @"";
}
}
實際使用中調用方法就可以了。
Demo地址