美文网首页
03对称加密算法

03对称加密算法

作者: 严兵胜 | 来源:发表于2017-07-01 09:36 被阅读0次

    对称加密的特点

    • 加密/解密使用相同的密钥
    • 可逆

    经典算法

    • DES
    • 3DES
    • AES

    废话不多说 直接上 工具类

    提示:
    1> 加密过程是先加密,再base64编码
    2> 解密过程是先base64解码,再解密

    • 实例
    #pragma mark - 对称加密
    
    - (void)encryption:(NSString *)pwdStr{
        
        // 秘钥
        NSString *keyString = @"abcsdhflasdh sldfhlsdflskdhfalsdf lsdkhfalsd ";
        
        //1.AES---ECB
        /*
         第一个参数:要加密的字符串
         第二个参数:密钥
         第三个参数:向量 nil
         */
        // 加密
        NSLog(@"AES-ECB加密:%@",[[EncryptionTools sharedEncryptionTools] encryptString:pwdStr keyString:keyString iv:nil]);
        // 解密
        NSLog(@"AES-ECB解密:%@",[[EncryptionTools sharedEncryptionTools] decryptString:@"vvUxQURv1pr20SV0ercEpg==" keyString:keyString iv:nil]);
        
        //2.AES---CBC
        uint8_t iv[8] = {1,2,3,4,5,6,7,8};
        NSData *data  = [[NSData alloc]initWithBytes:iv length:sizeof(iv)];
        // 加密
        NSLog(@"AES-CBC加密:%@",[[EncryptionTools sharedEncryptionTools] encryptString:pwdStr keyString:keyString iv:data]);
        // 解密
        NSLog(@"AES-CBC解密:%@",[[EncryptionTools sharedEncryptionTools] decryptString:@"Ylvqls4DdwqJ6zIfvpjgRg==" keyString:keyString iv:data]);
        
        //3.DES ---ECB 
        [EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithmDES;    //修改加密方式为DES
        // 加密
        NSLog(@"DES-ECB加密:%@",[[EncryptionTools sharedEncryptionTools] encryptString:pwdStr keyString:keyString iv:nil]);
        // 解密
        NSLog(@"DES-ECB解密:%@",[[EncryptionTools sharedEncryptionTools] decryptString:@"2TLQyEv635U=" keyString:keyString iv:nil]);
    }
    

    结果

    Snip20170701_46.png

    相关资料

    • .h中
    @interface EncryptionTools : NSObject
    
    + (instancetype)sharedEncryptionTools;
    
    /**
     @constant   kCCAlgorithmAES     高级加密标准,128位(默认)
     @constant   kCCAlgorithmDES     数据加密标准
     */
    @property (nonatomic, assign) uint32_t algorithm;
    
    /**
     *  加密字符串并返回base64编码字符串
     *
     *  @param string    要加密的字符串
     *  @param keyString 加密密钥
     *  @param iv        初始化向量(8个字节)
     *
     *  @return 返回加密后的base64编码字符串
     */
    - (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
    
    /**
     *  解密字符串
     *
     *  @param string    加密并base64编码后的字符串
     *  @param keyString 解密密钥
     *  @param iv        初始化向量(8个字节)
     *
     *  @return 返回解密后的字符串
     */
    - (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv;
    
    @end
    
    
    • .m中
    #import "EncryptionTools.h"
    
    @interface EncryptionTools()
    @property (nonatomic, assign) int keySize;
    @property (nonatomic, assign) int blockSize;
    @end
    
    @implementation EncryptionTools
    
    + (instancetype)sharedEncryptionTools
    {
        static EncryptionTools *instance;
        
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [[self alloc] init];
            instance.algorithm = kCCAlgorithmAES;
        });
        
        return instance;
    }
    
    - (void)setAlgorithm:(uint32_t)algorithm
    {
        _algorithm = algorithm;
        switch (algorithm) {
            case kCCAlgorithmAES:
                self.keySize = kCCKeySizeAES128;
                self.blockSize = kCCBlockSizeAES128;
                break;
            case kCCAlgorithmDES:
                self.keySize = kCCKeySizeDES;
                self.blockSize = kCCBlockSizeDES;
                break;
            default:
                break;
        }
    }
    
    - (NSString *)encryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv
    {
        
        // 设置秘钥
        NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
        uint8_t cKey[self.keySize];
        bzero(cKey, sizeof(cKey));
        [keyData getBytes:cKey length:self.keySize];
        
        // 设置iv
        uint8_t cIv[self.blockSize];
        bzero(cIv, self.blockSize);
        int option = 0;
        /**
         kCCOptionPKCS7Padding                      CBC 的加密
         kCCOptionPKCS7Padding | kCCOptionECBMode   ECB 的加密
         */
        if (iv) {
            [iv getBytes:cIv length:self.blockSize];
            option = kCCOptionPKCS7Padding;
        } else {
            option = kCCOptionPKCS7Padding | kCCOptionECBMode;
        }
        
        // 设置输出缓冲区
        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
        size_t bufferSize = [data length] + self.blockSize;
        void *buffer = malloc(bufferSize);
        
        // 开始加密
        size_t encryptedSize = 0;
    
        /*
         CCCrypt 对称加密算法的核心函数(加密/解密)
         第一个参数:kCCEncrypt 加密/ kCCDecrypt 解密
         第二个参数:加密算法,默认使用的是 AES/DES
         第三个参数:加密选项 ECB/CBC
                    kCCOptionPKCS7Padding                      CBC 的加密
                    kCCOptionPKCS7Padding | kCCOptionECBMode   ECB 的加密
         第四个参数:加密密钥
         第五个参数:密钥的长度
         第六个参数:初始向量
         第七个参数:加密的数据
         第八个参数:加密的数据长度
         第九个参数:密文的内存地址
         第十个参数:密文缓冲区的大小
         第十一个参数:加密结果的大小
         */
        CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                              self.algorithm,
                                              option,
                                              cKey,
                                              self.keySize,
                                              cIv,
                                              [data bytes],
                                              [data length],
                                              buffer,
                                              bufferSize,
                                              &encryptedSize);
        
        NSData *result = nil;
        if (cryptStatus == kCCSuccess) {
            result = [NSData dataWithBytesNoCopy:buffer length:encryptedSize];
        } else {    
            free(buffer);
            NSLog(@"[错误] 加密失败|状态编码: %d", cryptStatus);
        }
        
        return [result base64EncodedStringWithOptions:0];
    }
    
    - (NSString *)decryptString:(NSString *)string keyString:(NSString *)keyString iv:(NSData *)iv
    {
        
        // 设置秘钥
        NSData *keyData = [keyString dataUsingEncoding:NSUTF8StringEncoding];
        uint8_t cKey[self.keySize];
        bzero(cKey, sizeof(cKey));
        [keyData getBytes:cKey length:self.keySize];
        
        // 设置iv
        uint8_t cIv[self.blockSize];
        bzero(cIv, self.blockSize);
        int option = 0;
        if (iv) {
            [iv getBytes:cIv length:self.blockSize];
            option = kCCOptionPKCS7Padding;
        } else {
            option = kCCOptionPKCS7Padding | kCCOptionECBMode;
        }
        
        // 设置输出缓冲区
        NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
        size_t bufferSize = [data length] + self.blockSize;
        void *buffer = malloc(bufferSize);
        
        // 开始解密
        size_t decryptedSize = 0;
        CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                              self.algorithm,
                                              option,
                                              cKey,
                                              self.keySize,
                                              cIv,
                                              [data bytes],
                                              [data length],
                                              buffer,
                                              bufferSize,
                                              &decryptedSize);
        
        NSData *result = nil;
        if (cryptStatus == kCCSuccess) {
            result = [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
        } else {
            free(buffer);
            NSLog(@"[错误] 解密失败|状态编码: %d", cryptStatus);
        }
        
        return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
    }
    
    @end
    
    

    相关文章

      网友评论

          本文标题:03对称加密算法

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