美文网首页
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

相关文章

  • 加密算法的应用

    加密算法的应用 [TOC] 加密算法 加密算法主要分为对称加密和非对称加密。 对称加密 对称加密采用了对称密码编码...

  • 常用加密算法

    1 常用加密算法 常用加密算法有 对称加密算法、非对称加密算法、Hash算法 对称加密算法 加密和解密使用相同的秘...

  • linux c/c++面试知识点整理(六)

    51、对称加密算法和非对称加密算法 对称加密算法 对称加密才用了对称密码编码技术,它的特点是文件加密和解密使用...

  • Android 拿到私钥字符串对目标字符串进行加密

    关于加密算法 分为对称和非对称加密算法,其中RSA是常用非对称加密算法。对称加密中AES高级加密标准使用Rijnd...

  • Java 加密算法

    一、消息摘要算法 二、Base64 对称加密算法 三、Des 对称加密算法 四、Aes 对称加密算法 五、Pbe ...

  • 对称加密算法原理--OpenSSL演示、iOS代码运用及CCCr

    之前介绍了非对称加密算法,这篇文章介绍一下在非对称加密算法出现之前的对称加密算法,常见的对称加密算法、终端演示Op...

  • iOS 常用加密与签名方式

    常见的加密算法可以分成三类,对称加密算法,非对称加密算法和单向加密算法。对称加密算法(加解密密钥相同)常见的有:D...

  • 快速了解常用的非对称加密算法,再也不用担心面试官的刨根问底

    面试官:说一说你常用的加密算法有哪些? 加密算法通常被分为两种:对称加密算法和非对称加密算法。其中,对称加密算法在...

  • 1. 常用的加密算法

    常用的加解密算法分三大类:非对称密钥加密算法、对称密钥加密算法、Hash加密算法 非对称密钥加密算法常见算法:RS...

  • 什么是RSA算法

    常见的加密算法包括对称加密和非对称加密,对称加密算法一般应用于数据的加密。而非对称加密算法,一般用在签名认证和对称...

网友评论

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

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