美文网首页
AES加密打开方式...

AES加密打开方式...

作者: ZIM东东 | 来源:发表于2017-07-05 16:03 被阅读355次

    很久没写博客,Markdown牵出来遛遛

    AES加密时需要统一的几个参数。

    密钥长度(Key Size)
    加密模式(Cipher Mode)
    填充方式(Padding)
    初始向量(Initialization Vector)
    

    1.本例使用AES-128,

    2.AES属于块加密BlockCipher,块加密中有CBC、ECB、CTR、OFB、CFB等几种工作模式。本例使用CBC模式

    3.由于块加密只能对特定长度的数据块进行加密,因此CBC、ECB模式需要在最后一数据块加密前进行数据填充。(CFB,OFB和CTR模式由于与key进行加密操作的是上一块加密后的密文,因此不需要对最后一段明文进行填充)
    在iOS SDK中提供了PKCS7Padding

    ECB加密模式(不推荐):容易被攻击

    1.每次key,明文,密文的长度都必须是64位;
    2.数据块重复排序不需要检测;
    3.相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典被攻击
    4.一个错误仅仅会对一个密文块产生影响

    CBC加密方式(推荐):

    1.每次加密的密文长度为64位(8个字节);
    2.当相同的明文使用相同的密钥和初始向量的时候CBC模式总是产生相同的密文;
    3.密文块要依赖以前的操作结果,所以密文块不能进行重新排列;
    4.可以使用不同的初始化向量来避免相同的明文产生相同的密文,一定程度上抵抗字典攻击
    5.一个错误发生后,当前和以后的密文都会被影响;

    使用PKCS5Padding/PKCS7Padding填充可以兼容多平台语言之间AES加密解密

    注意: 这里每次产生的密文是相同的,因为设置了初试向量iv为16位个数的“0”。要产生不同的密文就要使用变化的初试向量iv

    ios使用案例

    创建一个类AESCipher继承NSObject

    .h文件如下:

    #import <Foundation/Foundation.h>
    
    NSString * aesEncryptString(NSString *content, NSString *key);
    NSString * aesDecryptString(NSString *content, NSString *key);
    
    NSData * aesEncryptData(NSData *data, NSData *key);
    NSData * aesDecryptData(NSData *data, NSData *key);
    
    

    .m文件如下:

    #import "AESCipher.h"
    #import <CommonCrypto/CommonCryptor.h>
    
    //注意:初始向量,默认16个0(]前后端保持�统一)
    NSString const *kInitVector = @"0000000000000000";
    
    
    size_t const kKeySize = kCCKeySizeAES128;
    
    NSData * cipherOperation(NSData *contentData, NSData *keyData, CCOperation operation) {
        NSUInteger dataLength = contentData.length;
        
        void const *initVectorBytes = [kInitVector dataUsingEncoding:NSUTF8StringEncoding].bytes;
        void const *contentBytes = contentData.bytes;
        void const *keyBytes = keyData.bytes;
        
        size_t operationSize = dataLength + kCCBlockSizeAES128;
        void *operationBytes = malloc(operationSize);
        size_t actualOutSize = 0;
        
        CCCryptorStatus cryptStatus = CCCrypt(operation,
                                              kCCAlgorithmAES,
                                              kCCOptionPKCS7Padding,
                                              keyBytes,
                                              kKeySize,
                                              initVectorBytes,
                                              contentBytes,
                                              dataLength,
                                              operationBytes,
                                              operationSize,
                                              &actualOutSize);
        
        if (cryptStatus == kCCSuccess) {
            return [NSData dataWithBytesNoCopy:operationBytes length:actualOutSize];
        }
        free(operationBytes);
        return nil;
    }
    
    NSString * aesEncryptString(NSString *content, NSString *key) {
        NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
        NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
        NSData *encrptedData = aesEncryptData(contentData, keyData);
        return [encrptedData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    }
    
    NSString * aesDecryptString(NSString *content, NSString *key) {
        NSData *contentData = [[NSData alloc] initWithBase64EncodedString:content options:NSDataBase64DecodingIgnoreUnknownCharacters];
        NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
        NSData *decryptedData = aesDecryptData(contentData, keyData);
        return [[NSString alloc] initWithData:decryptedData encoding:NSUTF8StringEncoding];
    }
    
    NSData * aesEncryptData(NSData *contentData, NSData *keyData) {
        NSString *hint = [NSString stringWithFormat:@"The key size of AES-%lu should be %lu bytes!", kKeySize * 8, kKeySize];
        NSCAssert(keyData.length == kKeySize, hint);
        return cipherOperation(contentData, keyData, kCCEncrypt);
    }
    
    NSData * aesDecryptData(NSData *contentData, NSData *keyData) {
        NSString *hint = [NSString stringWithFormat:@"The key size of AES-%lu should be %lu bytes!", kKeySize * 8, kKeySize];
        NSCAssert(keyData.length == kKeySize, hint);
        return cipherOperation(contentData, keyData, kCCDecrypt);
    }
    

    使用方法如下:

    /*
     使用案例:
     
     第一: 导入头文件
     #import "AESCipher.h"
    
     测试字符串
     NSString *TestStr = @"abc";
     设置key
     NSString *key = @"1234567812345678";
     
     NSString *cipherText = aesEncryptString(TestStr, key);
     
     NSLog(@"加密==%@", cipherText);
     
     NSString *decryptedText = aesDecryptString(cipherText, key);
     
     NSLog(@"解密==%@", decryptedText);
     
     
     */
     
    

    原文查看:
    http://blog.csdn.net/u013749540/article/details/70225594
    http://www.cnblogs.com/dcb3688/p/4608007.html

    相关文章

      网友评论

          本文标题:AES加密打开方式...

          本文链接:https://www.haomeiwen.com/subject/fdyqhxtx.html