iOS进阶_密码学进阶(二.对称加密算法代码演练)

2023-10-27

对称加密算法代码演练

/**
 *  终端测试指令
 *
 *  DES(ECB)加密
 *  $ echo -n hello | openssl enc -des-ecb -K 616263 -nosalt | base64
 *
  * DES(CBC)加密
 *  $ echo -n hello | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
 *
 *  AES(ECB)加密
 *  $ echo -n hello | openssl enc -aes-128-ecb -K 616263 -nosalt | base64
 *
 *  AES(CBC)加密
 *  $ echo -n hello | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt | base64
 *
 *  DES(ECB)解密
 *  $ echo -n HQr0Oij2kbo= | base64 -D | openssl enc -des-ecb -K 616263 -nosalt -d
 *
 *  DES(CBC)解密
 *  $ echo -n alvrvb3Gz88= | base64 -D | openssl enc -des-cbc -iv 0102030405060708 -K 616263 -nosalt -d
 *
 *  AES(ECB)解密
 *  $ echo -n d1QG4T2tivoi0Kiu3NEmZQ== | base64 -D | openssl enc -aes-128-ecb -K 616263 -nosalt -d
 *
 *  AES(CBC)解密
 *  $ echo -n u3W/N816uzFpcg6pZ+kbdg== | base64 -D | openssl enc -aes-128-cbc -iv 0102030405060708 -K 616263 -nosalt -d
 *
 *  提示:
 *      1> 加密过程是先加密,再base64编码
 *      2> 解密过程是先base64解码,再解密
 */

这里写图片描述

#import "ViewController.h"
#import "EncryptionTools.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    //AES - ECB 加密
    NSString * key = @"wt";

    NSString * pwd = [[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:nil];
    NSLog(@"加密: %@",pwd);
    //解密
    NSLog(@"解密: %@",[[EncryptionTools sharedEncryptionTools] decryptString:pwd keyString:key iv:nil]);

    //AES - CBC 加密
    uint8_t iv[8] = {2,3,4,5,6,7,0,0}; //直接影响加密结果!
    NSData * ivData = [NSData dataWithBytes:iv length:sizeof(iv)];

    NSString * pwd2 =[[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:ivData];
    NSLog(@"CBC加密: %@",pwd2);

    NSLog(@"CBC解密: %@", [[EncryptionTools sharedEncryptionTools] decryptString:pwd2 keyString:key iv:ivData]);

    //DES - ECB 加密
    [EncryptionTools sharedEncryptionTools].algorithm = kCCAlgorithmDES;
    NSString * pwd3 = [[EncryptionTools sharedEncryptionTools] encryptString:@"hello" keyString:key iv:nil];
    NSLog(@"DES 加密%@",pwd3);
    NSLog(@"DES 解密: %@", [[EncryptionTools sharedEncryptionTools] decryptString:pwd3 keyString:key iv:nil]);

}

@end

GitHub地址

对称加密算法工具类说明:

EncryptionTools.h

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCrypto.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

EncryptionTools.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
    /*
     kCCOptionPKCS7Padding                      CBC 的加密方式
     kCCOptionPKCS7Padding | kCCOptionECBMode   ECB 的加密方式
     */
    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 = [string dataUsingEncoding:NSUTF8StringEncoding];
    size_t bufferSize = [data length] + self.blockSize;
    void *buffer = malloc(bufferSize);

    // 开始加密
    size_t encryptedSize = 0;
    /***
     CCCrypt 对称加密算法的核心函数(加密/解密)
     参数:
     1.kCCEncrypt  加密/kCCDecrypt 解密
     2.加密算法,默认使用的是  AES/DES
     3.加密选项  ECB/CBC 
         kCCOptionPKCS7Padding                      CBC 的加密方式
         kCCOptionPKCS7Padding | kCCOptionECBMode   ECB 的加密方式
     4.加密密钥
     5.密钥长度
     6.iv 初始化向量,ECB 不需要指定
     7.加密的数据
     8.加密的数据的长度
     9.密文的内存地址
     10.密文缓冲区的大小
     11.加密结果大小
     */
    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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS进阶_密码学进阶(二.对称加密算法代码演练) 的相关文章

  • iOS进阶_密码学进阶(一.对称加密算法简介)

    加密算法 HASH 散列函数 不可逆 密码 识别 文件 识别 以下两种加密算法 都是可逆的 明文 gt 加密 gt 密文 密文 gt 解密 gt 明文 对称加密 传统加密算法 加密和解密使用同一个 密钥 密钥的保密工作就非常的重要 密钥会定
  • iOS进阶_密码学进阶(二.对称加密算法代码演练)

    对称加密算法代码演练 终端测试指令 DES ECB 加密 echo n hello openssl enc des ecb K 616263 nosalt base64 DES CBC 加密 echo n hello openssl enc
  • iOS进阶_密码学(四.抽取登录网络请求的单例)

    登录业务逻辑完善 在网络开发中 一般会有一个单例负责所有的网络请求 将这个网络登录的部分代码抽取出来 新建一个 类 复制方法 调整参数 测试登录能否成功运行 WTNetworkTools h import
  • iOS架构师_UML建模语言

    UML UML统称建模语言 面向对象软件的表转化建模语言 包含Booch MOT OOSE 工具 StarUML 时序图
  • iOS进阶_GCD(二.GCD串行队列&并发队列)

    GCD 核心概念 将任务添加到队列 指定任务执行的方法 任务 使用block封装 block 就是一个提前准备好的代码块 在需要的时候执行 队列 负责调度任务 串行队列 一个接一个的调度任务 并发队列 可以同时调度多个任务 任务执行函数 任
  • 对称加密算法(DES、3DES、AES)

    文章目录 DES 3DES AES DES DES加密算法因现代的计算能力 已经被淘汰掉了 因为现在在24小时内就可以被破解 特点 分组加密算法 明文以64位分组 64位明文输入 64位密文输出 对称算法 加密和解密使用同一密钥 有效密钥长
  • iOS架构师_架构模式(代理,block,通知,MVC,MVP,MVVM)

    1 什么是架构 没有明确的定义 属于设计的一方面 没明确的把设计和架构进行区分 它可以小到类与类之间的交互 大到不同模块之间 以及不同业务之间的交互 都可以从架构的层面去理解它 所有架构和设计模式的目的都是为了解耦合 2 基本的架构基础 案
  • iOS进阶—Runtime源码解析:动态方法解析

    GitHub参考 PS 参考GitHub分享的objc runtime master代码 及Runtime003代码 iOS进阶 目录 接上文iOS进阶 Runtime源码解析 消息发送 查看Runtime源码 No implementat
  • iOS核心动画CoreAnimation系统进阶(赛贝尔曲线-菜单侧滑动画拆分动画详解)

    我们知道动画是基于绘制的 多次绘制贝塞尔的过程就会形成动画 流畅的动画效果会给用户带来不一样的使用体验 下面我们就让App开发中经常使用到的侧滑动画进行拆分详解 效果图如下 为侧滑动画封装一个slideMenuView 绘制侧滑动画需要下面
  • iOS架构-组件化(Carthage管理工具)

    一 Carthage项目管理工具使用 Step 1 安装 更新Homebrew工具 1 usr bin ruby e curl fsSL https raw githubusercontent com Homebrew install ma
  • iOS架构师_SDWebImage源码分析

    1 对SDdemo的分析 针对SD的3 8 2版本进行分析 因为从git上面直接下载SD的源码 项目运行会报错 缺少libwebp这个库 我们下载3 8 2版本 运行 libwebp 是个webp的图片格式 属于谷歌的库 所以只能翻墙去国外
  • iOS自动化布局-AutoLayout约束优先级

    约束的优先级 AutoLayout添加的约束中也有优先级 Priority 优先级的数值1 1000 分为两种情况 一种情况是我们经常添加的各种约束 默认值1000 最大值 优先执行 条件允许的话系统会自动满足我们的约束需求 第二种就是固有
  • Objective-C实现链式编程语法(DSL)

    您越着急开始写代码 代码就会花费越长的时间 Carlson University of Wisconsin 前言 熟悉Objective C这一门编程语言的人都知道 Objective C中方法的调用都是通过中括号 实现的 比如 self
  • 区块链加密算法简述

    1 简述 加密简单而言就是通过一种算法将明文信息转换成密文信息 信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程 根据加解密的密钥是否相同 算法可以分为对称加密 非对称加密和对称加密和非对称加密的结合 2 对称加密 对称加密顾
  • iOS进阶_密码学(二.钥匙串访问)

    网络开发中的原则 在网络上不允许传输用户的明文隐私数据 在本地不允许保存用户的明文隐私数据 类似于QQ 微信的记住密码 在客户端本地保存用户加密后的密码 NSUserDefaults 明文保存才能反算 能够反算的算法 钥匙串访问 开放给开发
  • iOS开发之ReactiveCocoa框架(RAC)第五篇队列与高级函数

    h文件 import ViewController h import ReactiveCocoa interface ViewController end implementation ViewController void viewDid
  • iOS进阶_Log分类打印日志自动转换中文

    description方法是NSObject类的一个实例方法 因此所有的Object C对象都有description方法 description方法返回的永远是字符串 对于一个Person类 如果没有重写description方法 NSL
  • iOS进阶_密码学进阶(三.非对称加密算法-RSA公钥私钥的生成)

    应用场景 集成支付宝SDK 会看见 p12文件也有 非对称加密算法 一 运行终端 生成私钥 1 cd Users mac Desktop iOS 加密 2 openssl genrsa out private pem 512 生成私钥 注意
  • iOS开发 多线程的高级应用-信号量semaphore

    在iOS开发的道路上 多线程的重要性不言而喻 大部分我们都停留在基础的使用上面 缺乏高级应用 缺乏提升 是因为我们面对他太少 复杂的事情重复做 复杂的事务基础化 差距就是这样拉开了 言归正传 今天讲讲GCD的高级应用之信号量篇 一 信号量的
  • iOS进阶_NSURLSession(二.断点续传)

    断点续传 从上一篇文章中 我们了解了使用NSURLSession进行文件下载 我们在其基础上继续探索NSURLSession的断点续传 在NSURLSession中 我们使用reumeData来存储下载的数据进度 import ViewCo

随机推荐

  • nginx 配置 ssl

    1 1 Nginx如果未开启SSL模块 配置Https时提示错误 原因也很简单 nginx缺少http ssl module模块 编译安装的时候带上 with http ssl module配置就行了 但是现在的情况是我的nginx已经安装
  • Seq2Seq 模型知识总结

    Seq2Seq 模型知识总结 目录 Seq2Seq 模型知识总结 1 模型的提出 2 RNN 结构及使用 2 1 N vs N 2 2 1 vs N 2 3 N vs 1 3 Seq2Seq 模型 3 1 Seq2Seq 结构 3 2 编码
  • 你应该掌握的七种回归技术

    摘要 本文解释了回归分析及其优势 重点总结了应该掌握的线性回归 逻辑回归 多项式回归 逐步回归 岭回归 套索回归 ElasticNet回归等七种最常用的回归技术及其关键要素 最后介绍了选择正确的回归模型的关键因素 编者按 回归分析是建模和分
  • Java大数字运算(BigInteger类和BigDecimal类)

    Java中的超大数BIgInteger和BigDecimal 在我们处理大位数运算的时候 我们经常用的int和long类型的数已经不能够满足我们的运算了 那么这个时候就需要用到一个超大数来运算 这个时候我们会用到java math BigI
  • javaweb项目中完成数据的增删改查操作((maven,mybaits,tomcat,servlet,jsp包含 MVC模式 和 三层架构 ))

    目录 需求 完成品牌数据的增删改查操作 1 环境准备 1 1 创建工程模块 引入坐标 1 2创建三层架构的包结构 1 3创建数据库表 tb brand 1 4 创建实体类Brand 1 5 准备mybatis环境 2 查询所有 2 1编写B
  • JS将数组相同的元素进行分类

    js实现将数组中相同元素进行分类 思路是先将数组去重 这里采用对象的方式进行去重 然后将相同的元素重新放入一个数组内 实例如下
  • struts1 logic:iterate bean:write标签使用

    只是截取项目中部分代码 供参考及日后查阅 用struts1标签html select 展现select下拉列表 刚开始为如下代码 html view plain copy
  • 搭建RP-pppoe服务器

    1 安装rp pppoe 测试环境 PPPoe Server Ubuntu 20 04 PPPoe Client Windows 11 首先 我们先安装PPPoe服务器 我们需要下载rp pppoe的源码 然后自行编译安装 在安装之前需要安
  • OS银行家算法-Java

    OS作业 记录防丢 package Bank public class Banker public static void main String args OS os new OS 3 3 2 MyThread p0 new MyThre
  • 合宙AIR001开发板开箱测试

    简介 2023年7月合宙上架了一款新的MCU 支持Arduino Keil 主频高 资源大 接口全 合宙Air001 它是一款TSSOP20封装国产MCU 高集成化通讯外设 开发简单使用便捷 具备超高性价比 1 采用ARM 32位的M0 内
  • 效率利器之事件委托

    前言 公司产品部推出了一款新产品 经理指派小A负责推广工作 小A通过多方打听了解到推广流程 需要使用公司证件在几个平台注册账号 并经过多轮审批 小A经历了一番操作后感到身心俱疲 最终成功将产品发布到公众平台上 与此同时 公司的竞争部门也计划
  • 开题报告中拟解决的主要问题怎么写?

    在研究生求学阶段 学位论文质量的高低是衡量研究生培养质量的重要标志 而论文质量的高低 很大程度上取决于论文开题报告的内容的细致程度 从论文的选题 到研究内容与措施的探讨及最后开题报告的撰写 三者环环相扣 缺一不可 那么我们如何才能写好开题论
  • 决策树实战鸢尾花

    encoding utf 8 只要是机器学习中 代码的编写流程一般和下面这个一样 Create on 19 3 2 import warnings import sys import numpy as np import pandas as
  • 编程实现从键盘上反复输入10个整数,判断其是正数还是负数,如果是正数则累加求和。最后输出累加和值

    include
  • unity行为树

    本文转载自 http blog csdn net yupu56 article details 50151527 浅谈游戏AI 谈到游戏AI 很明显智能体拥有的知识条目越多 便显得更智能 但维护庞大数量的知识条目是个噩梦 使用有限状态机 F
  • 向量的夹角余弦公式_两个向量的夹角的余弦值怎么求过程!! – 手机爱问

    2006 04 02 急急急急 求向量2a 3b与向量3a b的夹角的余弦值 只要把两个 2a 3b 和 3a b 相乘 再除以它们模的积就OK了 具体如下 cos 2a 3b 3a b 3a b 2a 3b 因为 2a 3b 3a b 3
  • copy_to_user和copy_from_user两个函数的分析

    copy to user和copy from user两个函数的分析 转 在内核的学习中会遇到很多挺有意思的函数 而且能沿着一个函数扯出来很多个相关的函数 copy to user和copy from user就是在进行驱动相关程序设计的时
  • 19.集运架构之搭建Nginx服务器

    文章目录 0 需要使用的主机 1 web服务器 1 1简介 1 2架构 1 3主流服务器 1 4网络模型 2 部署Nginx 2 1yum安装 2 2编译安装 2 3平滑增加Nginx模块 2 4添加环境变量 3 Nginx的命令 3 1显
  • SQL注入(使用sqli-labs案例以及sqlmap自动化注入工具)

    SQL注入 sqli labs 一个实验平台 里面有完整的SQL注入课程 需要phpstudy环境 因此先安装phpstudy环境 phpstudy https www xp cn 安装后发现数据库和我本机的数据库出现冲突了 只能使用 sc
  • iOS进阶_密码学进阶(二.对称加密算法代码演练)

    对称加密算法代码演练 终端测试指令 DES ECB 加密 echo n hello openssl enc des ecb K 616263 nosalt base64 DES CBC 加密 echo n hello openssl enc