AES(The Advanced Encryption Standard)
AES是美國國家標準與技術研究所用于加密電子數(shù)據(jù)的規(guī)范。它被預期能成為人們公認的加密包括金融、電信和政府數(shù)字信息的方法
AES 是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192 和 256 位密鑰,并且用 128 位(16字節(jié))分組加密和解密數(shù)據(jù)。與公共密鑰密碼使用密鑰對不同,對稱密鑰密碼使用相同的密鑰加密和解密數(shù)據(jù)。通過分組密碼返回的加密數(shù)據(jù) 的位數(shù)與輸入數(shù)據(jù)相同。迭代加密使用一個循環(huán)結(jié)構(gòu),在該循環(huán)中重復置換(permutations )和替換(substitutions)輸入數(shù)據(jù)。
目前在商業(yè)App中使用的最多的是RSA與AES加密方式,兩種加密各種所長,所幸目前都有接觸過。
iOS中的使用
新建MySecurity類,繼承于NSObject
.h文件
<pre><code class='Xcode'>
import <Foundation/Foundation.h>
@interface MySecurity : NSObject
pragma mark -根據(jù)密匙初始化
-(instancetype) initWithKey:(NSString *) key;
pragma mark -加密
-(NSString *) AES256EncryptWithString:(NSString *) str;
pragma mark -解密
-(NSString *) AES256DecryptWithString:(NSString *) str;
pragma mark -獲取安全密匙
+(NSString*) getSecurityKey;
@end
</code></pre>
.m文件
<pre><code class='Xcode'>
import "MySecurity.h"
import "NSData+AES256.h"
import "NSString+MD5.h"
@interface MySecurity ()
@property(strong,nonatomic) NSString *key;
@end
@implementation MySecurity
pragma mark -獲取安全鑰匙
+(NSString*) getSecurityKey
{
return @"加密的密匙";
}
pragma mark -更加密碼密匙初始化
-(instancetype) initWithKey:(NSString *) key
{
self = [super init];
if (self)
{
self.key = key;
}
return self;
}
pragma mark -加密
-(NSString *) AES256EncryptWithString:(NSString *) str
{
NSData *dt1 = [str dataUsingEncoding:NSUTF8StringEncoding];
NSData *dt2 = [dt1 AES256EncryptWithKey:[self.key MD5]];
NSString *str2 = [dt2 base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
return str2;
}
pragma mark -解密
-(NSString *) AES256DecryptWithString:(NSString *) str
{
NSData *dt3 = [[NSData alloc] initWithBase64EncodedString:str options:NSDataBase64DecodingIgnoreUnknownCharacters];
NSData *dt4 = [dt3 AES256DecryptWithKey:[self.key MD5]];
NSString *str4 = [[NSString alloc] initWithData:dt4 encoding:NSUTF8StringEncoding];
return str4;
}
@end
</code></pre>
需要用到的NSData+AES256分類與NSString+MD5分類
<pre><code class='Xcode'>
//---------------NSData (AES256)頭文件------------
import <Foundation/Foundation.h>
@interface NSData (AES256)
/*
加密
(NSString*)key 32位秘鑰
返回加密后的 NSData
*/
- (NSData)AES256EncryptWithKey:(NSString)key ;
/*
解密
(NSString*)key 32位秘鑰
返回解密后的 NSData
*/
- (NSData)AES256DecryptWithKey:(NSString)key ;
@end
//---------------NSData (AES256)實現(xiàn)文件------------
import "NSData+AES256.h"
import <CommonCrypto/CommonCryptor.h>
@implementation NSData (AES256)
-
(NSData)AES256EncryptWithKey:(NSString)key {
char keyPtr[kCCKeySizeAES256 +1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)[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,
kCCKeySizeAES256,
NULL /* initialization vector (optional) /,
[self bytes],
dataLength, / input /
buffer,
bufferSize, / output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
-
(NSData)AES256DecryptWithKey:(NSString)key {
char keyPtr[kCCKeySizeAES256+1 ]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void* buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding|kCCOptionECBMode,
keyPtr,
kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self bytes],
dataLength, /* input */
buffer,
bufferSize, /* output */
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer); //free the buffer;
return nil;
}
@end
//---------------NSString (MD5)頭文件------------
import <Foundation/Foundation.h>
@interface NSString (MD5)
/*
獲取字符串的MD5值
返回32位MD5值
/
-(NSString) MD5;
@end
//---------------NSString (MD5)實現(xiàn)文件------------
import "NSString+MD5.h"
import <CommonCrypto/CommonDigest.h>
@implementation NSString (MD5)
pragma mark -MD5加密
-(NSString*) MD5
{
const char * cStrValue = [self UTF8String];
unsigned char theResult[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStrValue, (CC_LONG)strlen(cStrValue), theResult);
return [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
theResult[0], theResult[1], theResult[2], theResult[3],
theResult[4], theResult[5], theResult[6], theResult[7],
theResult[8], theResult[9], theResult[10], theResult[11],
theResult[12], theResult[13], theResult[14], theResult[15]];
}
@end
</code></pre>
使用
<pre><code class='Xcode'>
//初始化對象
MySecurity *security = [[MySecurity alloc] initWithKey:[MySecurity getSecurityKey]];
//加密
NSString * str1 = [security AES256EncryptWithString:@"要加密的內(nèi)容"];
//解密
NSString * str2 = [security AES256DecryptWithString:@"要解密的內(nèi)容"];
</code></pre>
總的來說,使用還是很簡單的,希望能幫助到大家。
end