美文网首页
iOS AES加密

iOS AES加密

作者: 0o简单o0 | 来源:发表于2020-03-18 10:18 被阅读0次

    导入头文件

    导入CommonCryptor为苹果提供的系统加密接口,支持iOS 和 mac 开发;
    #import <CommonCrypto/CommonCryptor.h>
    
    NSString *const kInitVector = @"16-Bytes--String";
    初始化向量,可选的。用于密码块链接(CBC)模式。如果存在,必须与所选的长度相同吗算法的块大小。
    如果CBC模式是被选择的(通过在没有任何模式位的情况下)选项标志),没有IV, a将使用NULL(所有零)IV。这是如果使用ECB模式或如果使用流,则忽略选择密码算法。良好的加密,总是用随机数据初始化IV。
    

    加密方法:

    + (NSString *)encryptAES:(NSString *)content key:(NSString *)key {
        
        NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
        NSUInteger dataLength = contentData.length;
        
        // 为结束符'\0' +1
        char keyPtr[kKeySize + 1];
        memset(keyPtr, 0, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
        
        // 密文长度 <= 明文长度 + BlockSize
        size_t encryptSize = dataLength + kCCBlockSizeAES128;
        void *encryptedBytes = malloc(encryptSize);
        size_t actualOutSize = 0;
        
        NSData *initVector = [kInitVector dataUsingEncoding:NSUTF8StringEncoding];
        
        CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                              kCCAlgorithmAES,
                                              kCCOptionPKCS7Padding,  // 系统默认使用 CBC,然后指明使用 PKCS7Padding
                                              keyPtr,
                                              kCCKeySizeAES128,//支持的AES key size 有 128位,192位,256位
                                              initVector.bytes,
                                              contentData.bytes,
                                              dataLength,
                                              encryptedBytes,
                                              encryptSize,
                                              &actualOutSize);
        
        if (cryptStatus == kCCSuccess) {
            // 对加密后的数据进行 base64 编码
            return [[NSData dataWithBytesNoCopy:encryptedBytes length:actualOutSize] base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
        }
        free(encryptedBytes);
        return nil;
    }
    

    解密方法:

    + (NSString *)decryptAES:(NSString *)content{
        // 把 base64 String 转换成 Data
        NSData *contentData = [[NSData alloc] initWithBase64EncodedString:content options:NSDataBase64DecodingIgnoreUnknownCharacters];
        NSUInteger dataLength = contentData.length;
        NSString * key = @"16BytesLengthKey";
        char keyPtr[kCCKeySizeAES128 + 1];
        memset(keyPtr, 0, sizeof(keyPtr));
        [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
        
        size_t decryptSize = dataLength + kCCBlockSizeAES128;
        void *decryptedBytes = malloc(decryptSize);
        size_t actualOutSize = 0;
        
        NSData *initVector = [kInitVector dataUsingEncoding:NSUTF8StringEncoding];
        
        CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                              kCCAlgorithmAES,
                                              kCCOptionPKCS7Padding,
                                              keyPtr,
                                              kCCKeySizeAES128,
                                              initVector.bytes,
                                              contentData.bytes,
                                              dataLength,
                                              decryptedBytes,
                                              decryptSize,
                                              &actualOutSize);
        
        if (cryptStatus == kCCSuccess) {
            return [[NSString alloc] initWithData:[NSData dataWithBytesNoCopy:decryptedBytes length:actualOutSize] encoding:NSUTF8StringEncoding];
            
            
        }
        free(decryptedBytes);
        return nil;
    }
    

    相关文章

      网友评论

          本文标题:iOS AES加密

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