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 ...
随机推荐
- Electron在Windows下的环境搭建
Electron作为一种用javascript写桌面程序的开发方式,现在已经被大众接受.下面就介绍如何在windows(>win7)下快速搭建Electron开发环境. 1. nodejs 的安 ...
- arcgis silverlight api 图层介绍
Layer |--TiledMapServiceLayer | |--ArcGISTiledMapServiceLayer |--DynamicLayer | |--DynamicMapService ...
- 修改虚拟机ip备份
修改虚拟机ip 因为别人写的很好,在此备份一下.
- 密码存储中MD5的安全问题与替代方案
md5安全吗?有多么地不安全?如何才能安全地存储密码?... md5安全吗? 经过各种安全事件后,很多系统在存放密码的时候不会直接存放明文密码了,大都改成了存放了 md5 加密(hash)后的密码,可 ...
- C++实现线性表的链接存储结构(单链表)
将线性表的抽象数据类型定义在链接存储结构下用C++的类实现,由于线性表的数据元素类型不确定,所以采用模板机制. 头文件linklist.h #pragma once #include <iost ...
- python 文件目录操作
在Python程序中执行目录和文件的操作 Python内置的os模块可以直接调用操作系统提供的接口函数 Python交互式命令行 >>> import os>>> ...
- 学习Road map Part 04 自动驾驶、SLAM、ROS、树莓派
学习Road map Part 04 自动驾驶.SLAM.ROS.树莓派
- Hive入门操作
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能.本文描述了HIve的一些基本操作,如有错误之处还请指出. 常用语法 #显示相关信息 sh ...
- angular里forRoot的作用
模块A是这样定义的 @NgModule({ providers: [AService], declarations: [ TitleComponent ], exports: [ TitleCompo ...
- ASP.NET 页面基本优化.
一.禁用Browser Link(目前主要用来是刷新vs ide 浏览界面),直接干掉. <!-- Visual Studio Browser Link --> <script ty ...