接基础篇(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地址