iOS开发加解密算法-基础篇(2)

接基础篇(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是一种对称加密算法,采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密。优点是算法公开、计算量小、加密速度快、加密效率高。缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。


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地址

你可能感兴趣的:(iOS开发加解密算法-基础篇(2))