golang 密码学-1. 对称加密
1. 对称加密
1.1 基础知识点
知识点大纲介绍
密码的基础概念
对称加密
非对称加密
单向散列函数
哈希函数
消息认证码
数字签名
证书
ssl/tls - https
为什么要加密,以及解决方案
保证数据安全
加密三要素
明文 / 密文
秘钥
定长的字符串
需要根据加密算法确定其长度
算法
加密算法
解密算法
加密算法和解密算法有可能是互逆的,也有可能相同
常用的两种加密方式
对称加密
秘钥:加密解密使用的是同一个秘钥,秘钥有一个
特点
双方向保证机密性
加密效率高,适合加密大数据,大文件
加密强度不高,相对于非对称加密
非对称加密
秘钥:加密解密使用的不同的秘钥,秘钥有两个,需要使用秘钥生成算法,得到密钥对
公钥 - 可以公开的秘钥
公钥加密数据,解密需要使用私钥
私钥 - 需要妥善保管的秘钥,知道的人越少越好
私钥加密,公钥解密
特点:
数据的机密性只能单方向保证
加密效率低,适合加密少量数据
加密强度高,相对于对称加密
凯撒密码
恺撒密码(Caesar cipher)是一种相传尤利乌斯・恺撒曾使用过的密码。恺撒于公元前 100 年左右诞生于古罗马,是一位著名的军事统帅。
恺撤密码是通过将明文中所使用的字母表按照一定的字数 “平移” 来进行加密的。
凯撒密码加解密公式
加密
E2(x) = (x + n) mod 26
解密
E2(x) = (x - n) mod 26
凯撒密码中的加密三要素
明文 / 密文
明文:小写字母表中的数据
密文:大写字母表中的数据
秘钥
按照上图秘钥为 3
算法
加密: +3
解密: -3
凯撒密码的安全性
不安全
密码信息安全常识
不要使用保密的密码算法(普通公司和个人)
使用低强度的密码比不进行任何加密更危险
任何密码总有一天都会被破解
密码只是信息安全的一部分
密码信息威胁
思考:信息安全处理必须要具备哪些特性?
1.2 对称加密
以分组为单位进行处理的密码算法称为分组密码(blockcipher)
编码的概念
G = 1024m
m = 1024kbyte
byte = 8bit
bit 0/1
计算机的操作对象并不是文字,而是由 0 和 1 排列而成的比特序列。
将现实世界中的东西映射为比特序列的操作称为编码(encoding)。
加密 -> 编码
解密 -> 解码
hello world -> 比特序列
h -> int 104 ->
DES – Data Encryption Standard
现在使用 DES 方式加密,数据还安全吗?
不安全,已经被破解了
是不是分组密码?
是,先对数据进行分组,然后在加密或解密
DES 的分组长度?
8byte == 64bit
DES 的秘钥长度?
56bit 秘钥长度 + 8bit 错误检测标志位 = 64bit == 8byte
3DES – Triple-DES
3DES 安全吗?
安全,但是效率低
算法描述?
进行了 3 次 des 加密
是不是分组密码?
是
3DES 分组长度?
8 字节
3DES 秘钥长度?
24 字节,在算法内部会被平均分成 3 份
3DES 加密过程?
秘钥 1 -> 加密,秘钥 2 -> 解密,秘钥 3 -> 加密
3DES 解密过程?
秘钥 1 -> 解密,秘钥 2 -> 加密,秘钥 3 -> 解密
AES – Advanced Encryption Standard
AES 安全吗?
安全,效率高,推荐使用的
是不是分组密码?
是
AES 分组长度?
128bit = 16 字节
AES 秘钥长度?
128bit = 16 字节
192bit = 24 字节
256bit = 32 字节
go 中的秘钥长度只能是 16 字节
1.3 分组密码的模式
按位异或
第一步需要将数据转换为二进制
按位异或操作符: ^
两个标志位进行按位异或操作:
相同为 0, 不同为 1
举例:
1 0 0 0 ----> 8
1 0 1 1 ----> 11
-----------------------按位异或一次
0 0 1 1 ----> 3
1 0 1 1 ----> 11
-----------------------按位异或两侧
1 0 0 0 -----> 8
=================================
a = 8
b = 11
a 和 b按位异或1次 ==> 加密
得到的结果再次和 b 按位异或 ===> 解密
ECB - Electronic Code Book, 电子密码本模式
特点:简单,效率高,密文有规律,容易被破解
最后一个明文分组必须要填充
des/3des -> 最后一个分组填充满 8 字节
aes -> 最后一个分组填充满 16 字节
不需要初始化向量
CBC - Cipher Block Chaining, 密码块链模式
特点:密文没有规律,经常使用的加密方式
最后一个明文分组需要填充
des/3des -> 最后一个分组填充满 8 字节
aes -> 最后一个分组填充满 16 字节
需要一个初始化向量 - 一个数组
数组的长度:与明文分组相等
数据来源:负责加密的人的提供的
加解密使用的初始化向量值必须相同
CFB - Cipher FeedBack, 密文反馈模式
特点:密文没有规律,明文分组是和一个数据流进行的按位异或操作,最终生成了密文
需要一个初始化向量 - 一个数组
数组的长度:与明文分组相等
数据来源:负责加密的人的提供的
加解密使用的初始化向量值必须相同
不需要填充
OFB - Output-Feedback, 输出反馈模式
特点:密文没有规律,明文分组是和一个数据流进行的按位异或操作,最终生成了密文
需要一个初始化向量 - 一个数组
数组的长度:与明文分组相等
数据来源:负责加密的人的提供的
加解密使用的初始化向量值必须相同
不需要填充
CTR - CounTeR, 计数器模式
特点:密文没有规律,明文分组是和一个数据流进行的按位异或操作,最终生成了密文
不需要初始化向量
go 接口中的 iv 可以理解为随机数种子,iv 的长度 == 明文分组的长度
不需要填充
最后一个明文分组的填充
使用 cbc, ecb 需要填充
要求:
明文分组中进行了填充,然后加密
解密密文得到明文,需要把填充的字节删除
使用 ofb, cfb, ctr 不需要填充
初始化向量 - IV
ecb, ctr 模式不需要初始化向量
cbc, ofc, cfb 需要初始化向量
初始化向量的长度
des/3des -> 8 字节
aes -> 16 字节
加解密使用的初始化向量相同
1.4 对称加密在 go 中的实现
des
3des
aes
# 加密流程:
1\. 创建一个底层使用des/3des/aes的密码接口
"crypto/des"
func NewCipher(key []byte) (cipher.Block, error) # -- des
func NewTripleDESCipher(key []byte) (cipher.Block, error) # -- 3des
"crypto/aes"
func NewCipher(key []byte) (cipher.Block, error) # == aes
2\. 如果使用的是cbc/ecb分组模式需要对明文分组进行填充
3\. 创建一个密码分组模式的接口对象
- cbc
func NewCBCEncrypter(b Block, iv []byte) BlockMode # 加密
- cfb
func NewCFBEncrypter(block Block, iv []byte) Stream # 加密
- ofb
- ctr
4\. 加密, 得到密文
原文地址
本文来自互联网知识整合,以及书籍。
防爬虫说明
禁止 学习某地爬虫,知乎爬虫,CSDN 爬虫。
本文,首发在 learnku 社区。
@author
汪春波(www.shxdledu.cn)