go加密算法:CBC对称加密(一)--DES
package main import (
"bytes"
//"crypto/aes"
"crypto/cipher"
"crypto/des"
"fmt"
) //cipher包实现了多个标准的用于包装底层块加密算法的加密算法实现。 /*
DES的操作
加解密实现思路
加密-CBC分组模式
1.创建并返回一个使用DES算法的cipher.Block接口
.秘钥长度为64bit,即64/8 = 8字节(byte)
2.对最后一个明文分组进行数据填充
.DES是以64比特的明文(比特序列)为一个单位来进行加密的
.最后一组不够64bit,则需要进行数据填充
3.创建一个密码分组为链接模式的,底层使用DES加密的BlockMode接口
4.加密连续的数据块 解密
1.创建并返回一个使用DES算法的cipher.Block接口
2.创建一个密码分组为链接模式的,底层使用DES解密的BlockMode接口
3.数据块解密
4.去掉最后一组的填充数据
*/ //使用des进行对称加密 func paddingText(src []byte, blockSize int) []byte {
//1.截取加密代码 段数
fmt.Println("加密之前的数据", src)
padding := blockSize - len(src)%blockSize
//2.无余数
if padding == 0 {
padText := bytes.Repeat([]byte{byte(blockSize)}, blockSize)
src = append(src, padText...)
} else { //else 一定直接要添加到该右括号的后面,不能令起一行
//3.有余数
padText := bytes.Repeat([]byte{byte(padding)}, padding)
src = append(src, padText...)
}
//4.添加余数
//src = append(src, padText...)
return src }
func unPaddingText(src []byte) []byte {
//1.取出最后一个元素
lasteum := int(src[len(src)-1])
//2.删除和最后一个元素相等长的字节
newText := src[:len(src)-lasteum]
return newText
} func encryptDES(src, key []byte) []byte {
//1.创建并返回一个使用DES算法的cipher.Block接口
/*
func NewCipher(key []byte) (cipher.Block, error)
创建并返回一个使用DES算法的cipher.Block接口。
*/
block, err := des.NewCipher(key)
if err != nil {
fmt.Println(err)
}
//2.对最后一个明文分组进行数据填充
src = paddingText(src, block.BlockSize()) //3.创建一个密码分组为链接模式的,底层使用DES加密的BlockMode接口
//iv := make([]byte,block.BlockSize())
iv := []byte("aaaabbbb")
/*
func NewCBCEncrypter(b Block, iv []byte) BlockMode
返回一个密码分组链接模式的、底层用b加密的BlockMode接口,初始向量iv的长度必须等于b的块尺寸。
*/
blockMode := cipher.NewCBCEncrypter(block, iv)
/*
type BlockMode interface {
// 返回加密字节块的大小
BlockSize() int
// 加密或解密连续的数据块,src的尺寸必须是块大小的整数倍,src和dst可指向同一内存地址
CryptBlocks(dst, src []byte)
}
*/
//4.加密连续的数据块
dst := make([]byte, len(src))
blockMode.CryptBlocks(dst, src) return dst
} func decryptDES(src, key []byte) []byte {
//1.创建并返回一个使用DES算法的cipher.Block接口
Block, err := des.NewCipher(key)
if err != nil {
panic(err)
}
//2.创建一个密码分组为链接模式的,底层使用DES解密的BlockMode接口
//iv := make([]byte,Block.BlockSize())
iv := []byte("aaaabbbb")
//func NewCBCDecrypter(b Block, iv []byte) BlockMode
//返回一个密码分组链接模式的、底层用b解密的BlockMode接口,初始向量iv必须和加密时使用的iv相同。
blockMode := cipher.NewCBCDecrypter(Block, iv)
//3.数据块解密
//dst := make([]byte,len(src))
//blockMode.CryptBlocks(dst,src)
blockMode.CryptBlocks(src, src)
//4.去掉最后一组的填充数据
newText := unPaddingText(src)
return newText
} func main() {
fmt.Println("====DES加解密====")
src := []byte("少壮不努力,老大徒伤悲")
key := []byte("12345678")
str := encryptDES(src, key)
str = decryptDES(str, key) fmt.Println("解密之后的数据", str)
}
/*
加密之前的数据 [229 176 145 229 163 174 228 184 141 229 138 170 229 138 155 44 232
128 129 229 164 167 229 190 146 228 188 164 230 130 178]
解密之后的数据 [229 176 145 229 163 174 228 184 141 229 138 170 229 138 155 44 232
128 129 229 164 167 229 190 146 228 188 164 230 130 178]
*/
go加密算法:CBC对称加密(一)--DES的更多相关文章
- go加密算法:CBC对称加密(一)--3DES/AES
其实对称加密中的:DES\3DES\AES 采取的加解密步骤一致,只是小的细节不太一样.大家多看看就能写出来了 // rsao1.go package main import ( "byte ...
- 加密算法(对称加密)AES、DES (非对称加密)RSA、DSA
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA
- pyDes 实现 Python 版的 DES 对称加密/解密--转
https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...
- .net 对称加密DESCryptoServiceProvider
1.生成密钥以加密和解密数据 DESCryptoServiceProvider 基于一种对称加密算法.对称加密需要密钥和初始化矢量 (IV) 来加密数据.要解密该数据,您必须拥有此同一密钥和 IV.您 ...
- 在php中使用对称加密DES3,开发银行卡绑定,实名验证……
对称加密:对称加密是一种数据加密算法,对一组数据的加密和解密都使用一样的密钥(key),可以有效保护金融数据,常见的对称加密有DES,3DES,AES.RC2.RC4.RC5. DES3: 对DES算 ...
- https 结合使用 对称加密和非对称加密
(一)对称加密(Symmetric Cryptography) ---共享密钥加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥( ...
- .NET中的DES对称加密
DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...
- Java和.NET使用DES对称加密的区别
Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...
- 对称加密----AES和DES加密、解密
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...
随机推荐
- 第9课 备忘便签-TinyDB
编写一只个性化的App便签小程序,TinyDB可能会帮上你. 1.组件设计 1)TextBox1输入需要记录存储的信息记录 2)四只button分别作为“添加 编辑 删除清空”信息记录 3)Lli ...
- 修改容器的hosts文件
修改容器的hosts文件 1.介绍 docker容器中的hosts文件虽然在宿主机磁盘上/var/lib/docker/containers/xxx/hosts中,但是修改该文件是无效的,需要通过其他 ...
- Android Studio使用GIt提交代码到本地仓库后没有Push,如何回退保存
当在AS中使用Git来提交代码时,有时候我们不注意的情况下会把不想提交的文件或文件夹(比如\build下的)提交到本地仓库,如果此时并没有Push到远程仓库的话.如果让本地仓库的提交回退并且保存之前的 ...
- vs2017 git到oschina 方法
vs2017中git基本使用方法: 1.开发环境vs2017,git服务器使用git.oschina.net 2.打开vs2017 创建项目 如果已有项目则: 3.完成后在文件前面会有小锁的图标,说明 ...
- 理解Underscore中的节流函数
上一篇中讲解了Underscore中的去抖函数(_.debounced),这一篇就来介绍节流函数(_.throttled). 经过上一篇文章,我相信很多人都已经了解了去抖和节流的概念.去抖,在一段连续 ...
- arcgis server 9.3 查看地图服务时出现"No Content"错误
问题描述: 使用ArcGIS Server Manager的Add new service功能发布一个服务.然后启动服务 用浏览器访问该服务的地址http://localhost/ArcGIS/ser ...
- websphere 配置库中已存在应用程序,异常处理
from:http://mengdboy.iteye.com/blog/1677379 出现此问题的原因之一:操作界面上没有卸载完成. 进行一下操作: 1.删除 $WAS_HOME/profiles/ ...
- Node.js在windows平台的安装
nodejs官网:https://nodejs.org/en/ 下载安装: node-v8.4.0-x64.msi 检查 path 中是否已经配置nodejs的安装路径,如果没有要配置. node ...
- 【转】Android开发:shape和selector和layer-list的(详细说明)
<shape>和<selector>在Android UI设计中经常用到.比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到<shape> ...
- 大数据-图表插件-echarts 样式修改(迭代)
修改折线图大小 myChart.setOption({ title:{ text:"价格指数" ...