密码学基础(二):对称加密
什么是对称加密
加密和解密使用相同的秘钥称为对称加密。
主流的对称加密算法
DES:已经淘汰
3DES:相对于DES有所加强,但是仍然存在较大风险
AES:全新的对称加密算法。
对称加密的特点
特点决定使用场景,对称加密拥有如下特点:
快速
速度快,可用于频率很高的加密场景。
可逆
使用同一个秘钥进行加密和解密。
分组加密
可选按照128、192、256位为一组的加密方式,加密后的输出值为所选分组位数的倍数。密钥的长度不同,推荐加密轮数也不同,加密强度也更强。
例如:
AES加密结果的长度由原字符串长度决定:一个字符为1byte=4bit,一个字符串为n+1byte,因为最后一位为'\0',所以当字符串长度小于等于15时,AES128得到的16进制结果为32位,也就是324=128byte,当长度超过15时,就是64位为1282byte。
对称加密的使用场景
因为对称加密速度快的特点,对称加密被广泛运用在各种加密场所中。但是因为其需要传递秘钥,一旦秘钥被截获或者泄露,其加密就会玩完全破解,所以AES一般和RSA一起使用。
因为RSA不用传递秘钥,加密速度慢,所以一般使用RSA加密AES中锁使用的秘钥后,再传递秘钥,保证秘钥的安全。秘钥安全传递成功后,一直使用AES对会话中的信息进行加密,以此来解决AES和RSA的缺点并完美发挥两者的优点,其中相对经典的例子就是HTTPS加密,后文会专门研究。
AES加密算法的基本原理
本文针对ECB模式下的AES算法进行大概讲解,针对每一步的详细算法不再该文讨论范围内。
1、明文分组
128位的明文被分成16个字节的明文矩阵,然后将明文矩阵转化成状态矩阵,以“abcdefghijklmnop”的明文为例:
2、密文分组
同样的,128位密钥被分成16组的状态矩阵。与明文不同的是,密文会以列为单位,生成最初的4x8x4=128的秘钥,也就是一个组中有4个元素,每个元素由每列中的4个秘钥叠加而成,其中矩阵中的每个秘钥为1个字节也就是8位。
生成初始的w[0]、w[1]、w[2]、w[3]原始密钥之后,通过密钥编排函数,该密钥矩阵被扩展成一个44个组成的序列W[0],W[1], … ,W[43]。该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,用于加密运算中的初始密钥加,后面40个字分为10组,每组4个32位的字段组成,总共为128位,分别用于10轮加密运算中的轮密钥加密,如下图所示:
3、轮密钥加
之所以把这一步单独提出来,是因为ECB和CBC模式中主要的区别就在这一步。
ECB模式中,初始秘钥扩展后生成秘钥组后(w0-w43),明文根据当前轮数取出w[i,i+3]进行加密操作。
CBC模式中,则使用前一轮的密文(明文加密之后的值)和当前的明文进行异或操作之后再进行加密操作。如图所示:
4、剩余轮操作
根据不同位数分组,官方推荐的加密轮数:
轮操作加密的第1轮到第9轮的轮函数一样,包括4个操作:字节代换、行位移、列混合和轮密钥加。最后一轮迭代不执行列混合。
5、按照组数对每组进行轮操作
当第一组加密完成时,后面的组循环进行加密操作知道所有的组都完成加密操作。
6、转码
一般会将结果转化成base64位,此时在iOS中应该使用base64编码的方式进行解码操作,而不是UTF-8。
Base64基本介绍
base64是一种编码方式,常用语传输8bit字节码。其编码原理如下所示:
1、取原数据
将原数据按照3个字节取为一组,即为3x8=24位
2、分组
将3x8=24的数据分为4x6=24的数据,也就是分为了4组
3、高位补0
将4个组中的数据分别在高位补上2个0,也就成了8x4=32,所以原数据增大了三分之一。
4、转码
根据base64编码表对数据进行转换,如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办,Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。
举个栗子:Man最后的结果就是TWFu。
为什么需要高位补0
因为base64产生的基础是避免在传输8Bit字节码数据时,不可见字符的可能产生的一些错误。因为字符是以8位为一个字节来处理,补零只是为了方便当前的处理规则,如果是6位,那么又需要做适配或者更改当前的处理规则。
base64编码的意义
计算机中所有的数据都是以0和1的二进制来存储,而所有的文字都是通过ascii表转化而来进而显示成对应的语言。但是ascii表中存在许多不可见字符,这些不可见字符在数据传输时,有可能经过不同硬件上各种类型的路由,在转义时容易发生错误,所以规定了64个可见字符(a-z、A-Z、0-9、+、/),通过base64转码之后,所有的二进制数据都是可见的。
ECB && CBC
ECB和CBC是两种加密工作模式。其相同点都是在开始轮加密之前,将明文和密文按照128/192/256进行分组。以128位为例,明文和密文都分为16组,每组1个字节为8位。
ECB工作模式中,每一组的明文和密文相互独立,每一组的明文通过对应该组的密文加密后生成密文,不影响其他组。
CBC工作模式中,后一组的明文在加密之前先使用前一组的密文进行异或运算后再和对应该组的密文进行加密操作生成密文。
为简单的分组加密。将明文和密文分成若干组后,使用密文对明文进行加密生成密文
CBC
对称加密在iOS中的使用
加密:
- (NSString *)AES128EncryptWithKey:(NSString *)key plainText:(NSString *)plainText {char keyPtr[kCCKeySizeAES128];// 初始化数组memset(keyPtr, 0, sizeof(keyPtr));// NSString->char[][key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];// 原文处理NSData *data = [plainText dataUsingEncoding:NSUTF8StringEncoding];NSUInteger dataLength = [data length];// 密文输出占位size_t bufferSize = dataLength + kCCBlockSizeAES128;void *buffer = malloc(bufferSize);size_t numBytesEncrypted = 0;// 加密CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, [data bytes], dataLength, buffer, bufferSize, &numBytesEncrypted);if (cryptStatus == kCCSuccess) {NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];NSString *stringBase64 = [resultData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];return stringBase64;}free(buffer);return nil;
}
解密:
- (NSString *)AES128DecryptWithKey:(NSString *)key secret:(NSString *)secret {char keyPtr[kCCKeySizeAES128];memset(keyPtr, 0, sizeof(keyPtr));[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];//base64解码NSData *data = [[NSData alloc] initWithBase64EncodedString:secret options:NSDataBase64DecodingIgnoreUnknownCharacters];NSUInteger dataLength = [data length];size_t bufferSize = dataLength + kCCBlockSizeAES128;void *buffer = malloc(bufferSize);size_t numBytesCrypted = 0;CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCBlockSizeAES128, NULL, [data bytes], dataLength, buffer, bufferSize, &numBytesCrypted);if (cryptStatus == kCCSuccess) {NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];}free(buffer);return nil;
}
密码学基础(二):对称加密相关推荐
- 密码学基础以及完整加密通讯过程解析
密码学基础以及完整加密通讯过程解析 前言 一.密码学相关基本概念 二.对称加密 三.非对称加密 四.杂凑算法 五.完整加密通讯过程 前言 密码学是研究如何隐密地传递信息的学科. 密码是通信双方按约定的 ...
- 古典密码学、DES对称加密、3DES对称加密知识总结和实验
实验三.古典密码学.DES对称加密.3DES对称加密 一.古典密码学:当铺密码.培根密码.摩斯密码.键盘密码.与佛论禅 1.当铺密码: 解密"由人俱一口中"和"大中口由人 ...
- 加解密基础——(对称加密、非对称加密和混合加密)
本文对之前学习过的加解密相关知识做一简单总结,以备后用. 1. 基本概念 加密算法 通常是复杂的数学公式,这些公式确定如何将明文转化为密文的过程和规则. 密钥 是一串被加入到算法中的随机比特. 待续 ...
- 密码学1: 对称加密体系
#简介 加密解密的过程中使用同一个密钥,也称作单密钥加密. 例如: I love you 每个字母按字母表的顺序想后移动一位变成J mpwf zpv,而J mpwf zpv按字母表的顺序向前移动一位变 ...
- 密码学基础之对称密码体制和公钥密码体制
对称密码体制 公钥密码体制 对称密码体制 分组密码的思想:将明文消息编码表示后的数字序列划分为成长为n的组,各组分别在密钥k控制下变换成等长的输出数字序列 DES就是一种分组密码算法,它将明文从算法的 ...
- 密码学基础(对称加密和非对称加密)
密码学基础 分类 对称加密 非对称加密 两类加密的特点 结合使用 举例 凯撒密码 代码实现-加密 代码实现-解密 main函数及文件加密 分类 一般分为: 对称加密 非对称加密 对称加密 加密和解密使 ...
- java祖冲之加密算法_对称加密和非对称加密
一 非对称加密 非对称加密和解密花费的时间长 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey),一般使用公钥进行加密,使用私钥进行解密. 常见的非对称加密 ...
- 网络基础(二)之HTTP与HTTPS
应用层 再谈 "协议" 协议是一种 "约定". socket api的接口, 在读写数据时, 都是按 "字符串" 的方式来发送接收的. 如果 ...
- 加密基础知识二 非对称加密RSA算法和对称加密
一.RSA的计算过程 上述过程中,出现了公钥(3233,17)和私钥(3233,2753),这两组数字是怎么找出来的呢?参考RSA算法原理(二) 首字母缩写说明:E是加密(Encryption)D是解 ...
- 密码学相关基础二(非对称加密和数字签名篇)
之前对称加密相关基础可以浏览https://blog.csdn.net/qq_44754515/article/details/123577250 一.密钥 1.1.定义 密钥就是一个巨大的数字 密钥 ...
最新文章
- 天地图专题三:根据标注点的范围确定天地图的中心点和缩放级别
- 与大疆并称双雄、估值近百亿的极飞科技,现在是一家什么公司?
- 信息系统项目管理师-质量管理知识点
- matlab疲劳驾驶_第一本无人驾驶技术书
- jedis连接mysql_使用Jedis操作Redis数据库
- Linux的10个最危险的命令
- 内核级利用通用Hook函数方法检测进程
- 第 7 章 本地方法栈
- Android 开发之 fill_parent、wrap_content和match_parent的区别
- BW作为源系统连接时,激活DSO或其他模型时提示8*数据源不存在,无法激活
- 转:KVC与KVO机制
- Spring Boot + Spring-Kafka 异步配置
- php 日期函数大全,php日期函数
- 南阳理工acm 15括号匹配(二)
- windows 打包c++运行库
- 锂电池充电管理芯片ic XSC01支持筋膜枪8.4V12.6V16.8充电
- 替换字符串中的通配符
- 程序人生|《阶层跃迁》读后感
- nginx的配置优化及经常使用的超时配置说明
- 纽约大学文理学院转计算机专业,纽约大学文理学院内部转专业 看看你能否转专业...
热门文章
- Java1.5并发包下阻塞队列的生产者与消费者功能简单实现
- Mybatis注解: SQL语句映射@Select @Insert @Updata @Delete @SelectKey
- 原来 Python 还有这些实用的功能和特点!
- [easyui] - 在easyui的table中展示提示框
- ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍
- thymeleaf模板的应用
- js学习笔记(新手)
- 多个checkbox 回显
- nagios介绍及Server安装(三)
- 你可以做一个更好的Coder为了自己的将来