aes默认填充算法 mysql_Go 实现加密算法系列之对称加密
加密算法简介
加密算法就是加密的方法,在密码学中,加密是将明文信息隐藏起来,使之缺少特殊信息时不可读。加密算法可以分为两类:对称加密和非对称加密。
1. 对称加密
将信息使用一个密钥进行加密,解密时使用同样的密钥,同样的算法进行解密。
2. 非对称加密
非对称加密又称公开密钥加密,密钥分为私密密钥和公开密钥,通过公钥加密,私钥解密的过程,并且加密和解密算法不同。
关于对称加密
对称加密是加密和解密双方持有相同的私钥,即加密方通过密钥执行加密过程,解密方通过相同的密钥执行解密过程,因为双方持有相同的密钥,所以叫做对称加密。同时,因为密钥理论上只有加解密双方持有,所以也叫做私钥加密。常见的对称加密算法有:DES,3DES,AES 以及 RC4 等。
对称加密分为序列密码和分组密码两类,如下图:
![](/assets/blank.gif)
1. 序列密码
序列密码单独加密每个位,它是通过将密钥序列中的每个位 与每个明文位相加实现的。同步序列密码的密码序列仅仅取决于密钥,而异步序列密码序列则取决于密钥和密文,如 RC4。
2. 分组密码
分组密码每次使用相同的密钥加密整个明文位分组。这意味着对给定分组内任何明文位的加密都依赖于与它同在一个分组内的其他所有明文位。绝大多数分组密码的分组长度要么是 128 位(16 字节),比如 AES,要么是 64 位(8 字节),比如 DES 和 3DES。
对称加密特点
- 算法可逆,即加密后可以通过解密还原数据。
- 加密效率高,加密速度快
- 安全性没有非对称加密高,因为密钥分发时存在安全隐患
对称加密算法
在写对称加密算法之前,有必要先提一下分组加密的操作模式有哪些,因为分组加密是对称加密中应用最多的加密方式,并且可以有不同的操作模式。
分组加密模式
1. 电子密码本模式(ECB)
ECB 模式要求明文长度必须是所使用密码的分组大小的整数倍,比如在 AES(后面会提到)中,明文长度应该是 16 字节的整数倍,如果不满足此长度要求,则必须对其进行填充,填充的方式有很多种,比如:在明文后附加单个"1",然后再根据需要附加足够多的"0"位,直到明文的长度达到分组长度的整数倍,如果明文的长度刚好是分组长度的整数倍,则填充的所有位刚好形成了一个单独的额外分组。ECB 加密解密如下图:
![](/assets/blank.gif)
ECB 优缺点:
- 加密和解密之间的分组同步不是必须的,即如果数据丢失,接收方还是可能解密已收到的分组。
- 加密高度确定,即只要密钥不变,相同的明文分组总是产生相同的密文分组。
- 明文分组的加密是完全独立的,与前面的分组没有任何关系。如果攻击者将密文分组重新排序,有可能会得到有效的明文。
- 密码分组链接模式(CBC)
2. 密码分组链接模式(CBC)
CBC 模式主要基于两种思想。第一,所有分组的加密都链接在一起,是得密文不仅依赖
,而且还依赖前面所有的明文分组。第二,加密过程使用的初始向量(IV)进行了随机化。
![](/assets/blank.gif)
3. 输出反馈模式(OFB)
OFB 模式使用分组密码来构建一个序列密钥加密方案。注意,在 OFB 模式中,密钥序列不是按位产生,而是以分组方式产生。密码的输出是 b 个密钥序列位,其中 b 为所使用的分组密码的宽度;将 b 为的明文与该 b 位的密钥序列进行异或操作即可实现对明文的加密。如下图:
![](/assets/blank.gif)
OFB 模式首先使用分组密码加密 IV,得到的密钥输出为 b 位密钥序列的第一个集合;将前一个密钥输出反馈给分组密码进行加密,即可计算出密钥序列位的下一个分组;不断重复此过程。因为使用的是同步序列密码,所以加密与解密操作完全相同,且加密解密位异或操作。OFB 的一个优点就是分组密码的计算与明文无关。因此,可以预计算密钥序列材料的一个或多个分组 S1。
4. 密码反馈模式(CFB)
CFB 模式也使用分组密码作为构建序列密码的基本元件,与 OFB 模式相同的是,CFB 也使用了反馈;而不同的是,OFB 反馈的是分组密码的输出,而 CFB 反馈的是密文。OFB 的基本思想是:要生成第一个密钥序列分组 S1,必须先加密 IV;而所有后续密钥序列分组 S2,S3,。。。都是通过加密前一个密文得到的。如下图所示:
![](/assets/blank.gif)
根据序列密码加密,CFB 加密解密操作也完全相同,但 CFB 模式是一个异步序列密钥加密。
5. 计数器模式(CTR)
与 OFB 和 CFB 模式一样,密钥序列也是以分组方式计算的。分组密码的输入为一个计数器,每当分组密码计算一个新密钥序列分组时,该计数器都会产生一个不同的值,如下图所示:
![](/assets/blank.gif)
初始化分组密码的输入时必须避免两次使用相同过的输入值,如果攻击者知道了使用相同输入加密的明文中的任何一个,就可以计算出密钥序列分组,从而可以解密其他明文。计数器模式最大的特点就是并行化,因为计数器模式不需要任何反馈。加入有两个分组加密引擎,即可以让两个引擎同时使用第一个分组密码加密计数器值 CTR1 和 CTR2,这两个分组密码引擎完成后,一个继续加密 CTR3,而另一个则加密 CTR4。
6. 伽罗瓦计数器模式(GCM)
GCM 是一种计算消息验证码的加密模式。MAC(消息验证码)由发送者计算密码校验和,并附加在消息后面,接收方也会计算此消息的密码校验和,并校验与发送者发送过来的是否相同,这样便可以确认消失是否是发送者发送过来的,且密文是否有被修改过。
主流对称加密算法实现(Go 语言)
下面将逐一介绍上面提到的对称加密的算法实现。
1. RC4
RC4 为流加密算法,即前面提到的序列加密,由伪随机数生成器和异或运算组成,密钥长度可变,范围在[1,255]。RC4 一个字节一个字节地加解密,由于采用的是异或运算,使用的是同一套算法。
func Encrypt(bytes []byte, key []byte) ([]byte, error) { c, err := rc4.NewCipher(key) if err != nil { return nil, err } var dst = make([]byte, len(bytes)) c.XORKeyStream(dst, bytes) return dst, nil}
//RC4为序列密码加密,采用异或运算,所以此处直接调用解密算法func Decrypt(encryptData, key []byte) ([]byte, error) { return Encrypt(encryptData, key)}
2. DES(3DES)
DES 是一种使用 56 位(7 字节)(注:其实 DES 的输入密钥是 64 位(8 字节),但是每个字节的第 8 位都作为前面 7 位的一个奇校验位,所以实际密钥有效位为 56 位。)密钥对 64 位(8 字节)长分组进行加密的算法,加、解密过程使用相同对密钥。
DES 算法机制为迭代,一共 16 轮,每轮操作完全相同,但使用不同的子密钥,子密钥都是由主密钥推导而来的,都是从输入密钥中选择 48 个置换位。DES 加密流程如下:
![](/assets/blank.gif)
3DES 即为三重 DES 加密,3DES 加密密钥长度为 192 位(24 字节)。
解密过程主要为密钥编排逆转,即解密的第一轮需要子密钥 16;第二轮需要子密钥 15;以此类推。
func Encrypt(plainText []byte, key []byte) ([]byte, error) { //block, err := des.NewTripleDESCipher(key)为三重DES加密 block, err := des.NewCipher(key) if err != nil { return nil, err }
blockSize := block.BlockSize() //分组大小 plainText = paddingWithPKCS5(plainText, blockSize) //填充
var cipherText = make([]byte, len(plainText))
//ECB每个分组单独加密 var temp = cipherText for len(plainText) > 0 { block.Encrypt(temp, plainText[:blockSize]) plainText = plainText[blockSize:] temp = temp[blockSize:] } return cipherText, nil}
func Decrypt(cipherText []byte, key []byte) ([]byte, error) { //block, err := des.NewTripleDESCipher(key)为三重DES加密 block, err := des.NewCipher(key) if err != nil { return nil, err }
blockSize := block.BlockSize() //分组大小
var plainText = make([]byte, len(cipherText))
//ECB每个分组单独加密 var temp = plainText for len(cipherText) > 0 { block.Decrypt(temp, cipherText[:blockSize]) cipherText = cipherText[blockSize:] temp = temp[blockSize:] } plainText = unPaddingWithPKCS5(plainText) return plainText, nil}
func paddingWithPKCS5(data []byte, blockSize int) []byte { //需要填充的值以及数量 padding := blockSize - len(data)%blockSize //组装填充值([]byte) var paddingData = []byte{byte(padding)} paddingData = bytes.Repeat(paddingData, padding) //append填充 data = append(data, paddingData...) return data}
func unPaddingWithPKCS5(data []byte) []byte { padding := int(data[len(data)-1]) return data[:len(data)-padding]}
3. AES
AES 拥有三种不同的密钥长度抵抗蛮力攻击,分别为 128 位,192 位和 256 位,分组大小为 128 位。
func Encrypt(plainText []byte, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err }
blockSize := block.BlockSize() //分组大小 plainText = paddingWithPKCS5(plainText, blockSize) //填充
var cipherText = make([]byte, len(plainText))
//CBC模式 blockMode := cipher.NewCBCDecrypter(block, key[:blockSize]) blockMode.CryptBlocks(cipherText,plainText) return cipherText, nil}
func Decrypt(cipherText []byte, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) if err != nil { return nil, err }
blockSize := block.BlockSize() //分组大小
var plainText = make([]byte, len(cipherText))
//CBC模式 blockMode := cipher.NewCBCEncrypter(block, key[:blockSize]) blockMode.CryptBlocks(plainText, cipherText)
plainText = unPaddingWithPKCS5(plainText)
return plainText, nil}
引用资料
《维基百科》《深入浅出密码学——常用加密技术原理与应用》
最后
如有错误,请不吝赐教!Thanks!
附上代码链接:https://github.com/pyihe/secret。
推荐阅读
Go 中对 int 类型的数据加密,有哪些好的方案?
学习交流 Go 语言,扫码回复「进群」即可
站长 polarisxu
自己的原创文章
不限于 Go 技术
职场和创业经验
Go语言中文网
每天为你
分享 Go 知识
Go爱好者值得关注
aes默认填充算法 mysql_Go 实现加密算法系列之对称加密相关推荐
- 三种常见加密算法MD5、对称加密,非对称加密【多测师_王sir】
一.MD5加密 MD5加密的特点: 不可逆运算(不能破解.不能解密) 对不同的数据加密的结果是定长的32位字符(不管文件多大都一样) 对相同的数据加密,得到的结果是一样的(也就是复制) 抗修改性 : ...
- 可逆与不可逆算法,对称加密与非对称加密算法总结
文章目录 1. 加密算法的种类 2. 不可逆加密算法 ①:MD5 ②:HMAC系列 ③:SHA系列 3. 可逆加密算法 1. 对称加密 ①:DES ②:3DES ③:AES 2. 非对称加密 ①:RS ...
- java pkcs7 和 pkcs5_PKCS7 / PKCS5 填充算法
PKCS7 PKCS7是当下各大加密算法都遵循的数据填充算法,且 OpenSSL 加密算法簇的默认填充算法就是 PKCS7. AES-128, AES-192, AES-256 的数据块长度分别为 1 ...
- RSA(非对称)+AES(对称加密)前后台交互
前言: 为了提高安全性采用了RSA,但是为了解决RSA加解密性能问题,所以采用了RSA(非对称)+AES(对称加密)方式,如果只考虑其中一种的,可以去看我前面两篇文章,专门单独写的demo,可以 ...
- java aes php_php和java的aes默认加密算法有点区别及解决方法。
1.php和java的aes默认加密算法有点区别,php能解密java加密的密文,但java不能解密php加密的密文.原因在于: 1.Java中AES加密与解密默认使用AES/ECB/PKCS5Pad ...
- Java加密算法—对称加密(DES、AES)
目录 1.概述 2.加密模式 2.1 ECB 2.2 CBC 3.填充模式 4.对称加密.解密实现 1.概述 对称加密就是采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,也称为单密 ...
- 3、【java数据安全】对称加密的5种(DES/3DES、AES、IDEA、PBE)常见算法的使用示例
java数据安全 系列文章 1.[java数据安全]数据安全之加密解密(base64.MD.SHA.DES.AES.IDEA.PBE.DH.RSA.EIGamal).数字签名(DSA.ECDSA)和数 ...
- 安全系列(二)-银行加密体系与加解密算法速览
一.银行3级加密体系说明: 转:加密体系介绍(LMK.ZMK.ZAK.ZPK)_炎升的博客-CSDN博客_lmk密钥 二.加解密算法 1.分类说明 其中按国际和国内使用主要分为:通用算法和国密. 通用 ...
- 【5G/4G】NAS与AS层 完整性保护与加密算法系列文章
文章目录 NAS与AS层 完整性保护与加密算法系列文章 算法简介 算法链接如下 本人就职于国际知名终端厂商,负责modem芯片研发. 在5G早期负责终端数据业务层.核心网相关的开发工作,目前牵头6G算 ...
最新文章
- 在express.js上启用HTTPS
- 运用python的方式_六、python 方法的使用
- 人山人海人立方 http://renlifang.msra.cn
- jeecg t:datagrid标签 每页显示条数 扩展
- 无人车制胜关键:Apollo决策系统全面剖析
- mac上远程连接windows
- 如何将mp4视频转换成aac音频
- 超详细软件著作权申请——资料篇
- 如何用思维导图快速理解PMBOK-PMP第六版教材
- android 微博 登录,Android第三方登录之微博登录
- 夏天摆地摊,卖什么产品赚钱比较快呢?
- 裁员取暖?互联网行业深陷寒冬,网易被爆裁员30%!
- 莫言2012诺贝尔奖颁奖词
- 2022版u-boot启动分析笔记之一(start.S与lowlevel_init.S)
- 2023西安交通大学计算机考研信息汇总
- 高斯PDF的性质及其推论
- 小聊聊NGUI中Panel的Clip功能(之一)
- 雅思词汇之万词plan:第1-365天
- QT+PCL+VS制作点云显示界面(彩色显示xyz点云)
- 设备调试---用万用表寻找GND、RXD、TXD
热门文章
- 基于项目管理的软件产品研发管理研究
- mongodb创建集合与php扩展
- Mat类具体解释(二)
- 【实践】通过Composer,安装yii2-advanced
- OpenGL中的投影使用
- Android开发(22)--seekBar采用handler消息处理操作
- 智能手机之新手篇[转]
- java 私有静态类_java中,在私有的静态类中如何触发jbutton
- 更新尺寸调用什么方法_Java 多线程启动为什么调用 start() 方法而不是 run() 方法?...
- 《高频交易》读书笔记