搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 上海php自学中心 > golang 密码学-1. 对称加密

golang 密码学-1. 对称加密

上海php自学中心 2020-05-23

1. 对称加密

1.1 基础知识点

  1. 知识点大纲介绍

  • 密码的基础概念

  • 对称加密

  • 非对称加密

  • 单向散列函数

  • 哈希函数

  • 消息认证码

  • 数字签名

  • 证书

  • ssl/tls - https

  1. 为什么要加密,以及解决方案

保证数据安全

  1. 加密三要素

  • 明文 / 密文

  • 秘钥

  • 定长的字符串

  • 需要根据加密算法确定其长度

  • 算法

  • 加密算法

  • 解密算法

  • 加密算法和解密算法有可能是互逆的,也有可能相同

  1. 常用的两种加密方式

  • 对称加密

  • 秘钥:加密解密使用的是同一个秘钥,秘钥有一个

  • 特点

  • 双方向保证机密性

  • 加密效率高,适合加密大数据,大文件

  • 加密强度不高,相对于非对称加密

  • 非对称加密

  • 秘钥:加密解密使用的不同的秘钥,秘钥有两个,需要使用秘钥生成算法,得到密钥对

  • 公钥 - 可以公开的秘钥

  • 公钥加密数据,解密需要使用私钥

  • 私钥 - 需要妥善保管的秘钥,知道的人越少越好

  • 私钥加密,公钥解密

  • 特点:

  • 数据的机密性只能单方向保证

  • 加密效率低,适合加密少量数据

  • 加密强度高,相对于对称加密

  1. 凯撒密码

恺撒密码(Caesar cipher)是一种相传尤利乌斯・恺撒曾使用过的密码。恺撒于公元前 100 年左右诞生于古罗马,是一位著名的军事统帅。

恺撤密码是通过将明文中所使用的字母表按照一定的字数 “平移” 来进行加密的。



  • 凯撒密码加解密公式

  • 加密

E2(x) = (x + n) mod 26

  • 解密

E2(x) = (x - n) mod 26

  • 凯撒密码中的加密三要素

  • 明文 / 密文

  • 明文:小写字母表中的数据

  • 密文:大写字母表中的数据

  • 秘钥

  • 按照上图秘钥为 3

  • 算法

  • 加密: +3

  • 解密: -3

  • 凯撒密码的安全性

不安全

  1. 密码信息安全常识

  • 不要使用保密的密码算法(普通公司和个人)

  • 使用低强度的密码比不进行任何加密更危险

  • 任何密码总有一天都会被破解

  • 密码只是信息安全的一部分

  1. 密码信息威胁



思考:信息安全处理必须要具备哪些特性?

1.2 对称加密

以分组为单位进行处理的密码算法称为分组密码(blockcipher)

  1. 编码的概念

G = 1024m

m = 1024kbyte

byte = 8bit

bit 0/1

计算机的操作对象并不是文字,而是由 0 和 1 排列而成的比特序列

将现实世界中的东西映射为比特序列的操作称为编码(encoding)

加密 -> 编码

解密 -> 解码

hello world -> 比特序列

h -> int 104 ->

  1. DES – Data Encryption Standard

  • 现在使用 DES 方式加密,数据还安全吗?

  • 不安全,已经被破解了

  • 是不是分组密码?

  • 是,先对数据进行分组,然后在加密或解密

  • DES 的分组长度?

  • 8byte == 64bit

  • DES 的秘钥长度?

  • 56bit 秘钥长度 + 8bit 错误检测标志位 = 64bit == 8byte

  1. 3DES – Triple-DES

  • 3DES 安全吗?

  • 安全,但是效率低

  • 算法描述?

  • 进行了 3 次 des 加密

  • 是不是分组密码?

  • 3DES 分组长度?

  • 8 字节

  • 3DES 秘钥长度?

  • 24 字节,在算法内部会被平均分成 3 份

  • 3DES 加密过程?

  • 秘钥 1 -> 加密,秘钥 2 -> 解密,秘钥 3 -> 加密

  • 3DES 解密过程?

  • 秘钥 1 -> 解密,秘钥 2 -> 加密,秘钥 3 -> 解密

  1. AES – Advanced Encryption Standard

  • AES 安全吗?

  • 安全,效率高,推荐使用的

  • 是不是分组密码?

  • AES 分组长度?

  • 128bit = 16 字节

  • AES 秘钥长度?

  • 128bit = 16 字节

  • 192bit = 24 字节

  • 256bit = 32 字节

  • go 中的秘钥长度只能是 16 字节

1.3 分组密码的模式

  1. 按位异或

  • 第一步需要将数据转换为二进制

  • 按位异或操作符: ^

  • 两个标志位进行按位异或操作:

  • 相同为 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 按位异或 ===> 解密
  1. ECB - Electronic Code Book, 电子密码本模式

  • 特点:简单,效率高,密文有规律,容易被破解

  • 最后一个明文分组必须要填充

  • des/3des -> 最后一个分组填充满 8 字节

  • aes -> 最后一个分组填充满 16 字节

  • 不需要初始化向量

  1. CBC - Cipher Block Chaining, 密码块链模式

  • 特点:密文没有规律,经常使用的加密方式

  • 最后一个明文分组需要填充

  • des/3des -> 最后一个分组填充满 8 字节

  • aes -> 最后一个分组填充满 16 字节

  • 需要一个初始化向量 - 一个数组

  • 数组的长度:与明文分组相等

  • 数据来源:负责加密的人的提供的

  • 加解密使用的初始化向量值必须相同

  1. CFB - Cipher FeedBack, 密文反馈模式

  • 特点:密文没有规律,明文分组是和一个数据流进行的按位异或操作,最终生成了密文

  • 需要一个初始化向量 - 一个数组

  • 数组的长度:与明文分组相等

  • 数据来源:负责加密的人的提供的

  • 加解密使用的初始化向量值必须相同

  • 不需要填充

  1. OFB - Output-Feedback, 输出反馈模式

  • 特点:密文没有规律,明文分组是和一个数据流进行的按位异或操作,最终生成了密文

  • 需要一个初始化向量 - 一个数组

  • 数组的长度:与明文分组相等

  • 数据来源:负责加密的人的提供的

  • 加解密使用的初始化向量值必须相同

  • 不需要填充

  1. CTR - CounTeR, 计数器模式

  • 特点:密文没有规律,明文分组是和一个数据流进行的按位异或操作,最终生成了密文

  • 不需要初始化向量

  • go 接口中的 iv 可以理解为随机数种子,iv 的长度 == 明文分组的长度

  • 不需要填充

  1. 最后一个明文分组的填充

  • 使用 cbc, ecb 需要填充

  • 要求:

  • 明文分组中进行了填充,然后加密

  • 解密密文得到明文,需要把填充的字节删除

  • 使用 ofb, cfb, ctr 不需要填充

  1. 初始化向量 - IV

  • ecb, ctr 模式不需要初始化向量

  • cbc, ofc, cfb 需要初始化向量

  • 初始化向量的长度

  • des/3des -> 8 字节

  • aes -> 16 字节

  • 加解密使用的初始化向量相同

1.4 对称加密在 go 中的实现

  1. des

  2. 3des

  3. 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)


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《golang 密码学-1. 对称加密》的版权归原作者「上海php自学中心」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注上海php自学中心微信公众号

上海php自学中心微信公众号:pyLearnCenter

上海php自学中心

手机扫描上方二维码即可关注上海php自学中心微信公众号

上海php自学中心最新文章

精品公众号随机推荐