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的更多相关文章

  1. go加密算法:CBC对称加密(一)--3DES/AES

    其实对称加密中的:DES\3DES\AES 采取的加解密步骤一致,只是小的细节不太一样.大家多看看就能写出来了 // rsao1.go package main import ( "byte ...

  2. 加密算法(对称加密)AES、DES (非对称加密)RSA、DSA

    目前主流的加密方式有:(对称加密)AES.DES        (非对称加密)RSA.DSA

  3. pyDes 实现 Python 版的 DES 对称加密/解密--转

    https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...

  4. .net 对称加密DESCryptoServiceProvider

    1.生成密钥以加密和解密数据 DESCryptoServiceProvider 基于一种对称加密算法.对称加密需要密钥和初始化矢量 (IV) 来加密数据.要解密该数据,您必须拥有此同一密钥和 IV.您 ...

  5. 在php中使用对称加密DES3,开发银行卡绑定,实名验证……

    对称加密:对称加密是一种数据加密算法,对一组数据的加密和解密都使用一样的密钥(key),可以有效保护金融数据,常见的对称加密有DES,3DES,AES.RC2.RC4.RC5. DES3: 对DES算 ...

  6. https 结合使用 对称加密和非对称加密

    (一)对称加密(Symmetric Cryptography) ---共享密钥加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥( ...

  7. .NET中的DES对称加密

    DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...

  8. Java和.NET使用DES对称加密的区别

    Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...

  9. 对称加密----AES和DES加密、解密

    目前主流的加密方式有:(对称加密)AES.DES        (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...

随机推荐

  1. android应用js

    http://blog.csdn.net/carson_ho/article/details/64904691 通过 WebViewClient 的方法shouldOverrideUrlLoading ...

  2. tp.c

    calculate throughput /* gput.c: out.tr¤ò²òÀϤ·¤Æ¥¹¥ë¡¼¥×¥Ã¥ÈÆÃÀ­¤ò·×»»¤¹¤ë * out.et¤ò²òÀϤ·¤ÆºÆÁ÷¥¿¥ ...

  3. 让NSUserDefaults使用起来像对象一样容易

    让NSUserDefaults使用起来像对象一样容易 巧妙的设计,是为了简化开发提升效率而存在. 设计要点: 1. 单例模式 2. 重写setter,getter方法 3. 专门的类来管理单例 使用时 ...

  4. 个人Hadoop编程代码记录

    **WordCount package cn.cpl.recom; import java.io.IOException; import java.util.StringTokenizer; impo ...

  5. 如何在 MSBuild Target(Exec)中报告编译错误和编译警告

    编译错误和编译警告 MSBuild 的 Exec 自带有错误和警告的标准格式,按照此格式输出,将被识别为编译错误和编译警告. 而格式只是简简单单的 error: 开头或者 warning: 开头.冒号 ...

  6. June 27th 2017 Week 26th Tuesday

    Happiness takes no account of time. 幸福不觉光阴过. At the beginning of this week, I planned to make some s ...

  7. Kafka与MQ的区别

    作为消息队列来说,企业中选择mq的还是多数,因为像Rabbit,Rocket等mq中间件都属于很成熟的产品,性能一般但可靠性较强, 而kafka原本设计的初衷是日志统计分析,现在基于大数据的背景下也可 ...

  8. [后台管理]一套用vue搭建的框架

    1.提前的准备工作 前端开发工具有许多,当下流行的sublime等等都是前端比较受欢迎的,nodeJS和Vue等都是前端框架搭建流行的一套 安装nodeJS 设置环境变量 安装Visual Studi ...

  9. String.format字符串拼接

    一.String.Format1.简介      String类的format()方法用于创建格式化的字符串以及连接多个字符串对象. 2.参数      format()方法有两种重载形式. form ...

  10. Java添加事件的几种方式(转载了codebrother的文章)

    /** * Java事件监听处理——自身类实现ActionListener接口,作为事件监听器 * * @author codebrother */ class EventListener1 exte ...