其实对称加密中的:DES\3DES\AES 采取的加解密步骤一致,只是小的细节不太一样.大家多看看就能写出来了
// rsao1.go
package main import (
"bytes"
"crypto/aes"
"crypto/cipher"
"crypto/des"
"fmt"
) /*
明文加密的分组操作
.分组的长度 = 密钥的长度 //key = 64bit/8
.将每组数据和密钥进行位运算
.每组的密文长度 = 每组的明文长度
*/
func main() {
fmt.Println("=== des 加解密 ===")
scr := []byte("少壮不努力,活该你单身")
key := []byte("12345678") src := encryptDES(scr, key)
//fmt.Println("enpadding", src):每次运行加密后的数据一样
des := decryptDES(src, key)
fmt.Println("depadding", des) fmt.Println("=== 3des 加解密 ===")
scr1 := []byte("少壮不努力,活该你单身,223333")
key1 := []byte("aaabbbaa12345678ccddeeff") src1 := encryptTripleDES(scr1, key1)
//fmt.Println("enpadding", src1):每次运行加密后的数据一样
des1 := decryptTripleDES(src1, key1)
fmt.Println("depadding", des1) fmt.Println("=== aes 加解密 ===")
scra := []byte("少壮不努力,活该你单身,223333")
keya := []byte("aaabbbaa12345678") srca := encryptAES(scra, keya)
//fmt.Println("enpadding", srca):每次运行加密后的数据一样
desa := decryptAES(srca, keya)
fmt.Println("depadding", desa)
} func padding(src []byte, blockSize int) []byte {
//func padding(src []byte, blockSize int) {
//1.截取加密代码 段数
fmt.Println("enpadding", src)
padding := blockSize - len(src)%blockSize
//2.有余数
padText := bytes.Repeat([]byte{byte(padding)}, padding)
//3.添加余数
src = append(src, padText...)
return src }
func Depadding(src []byte) []byte {
//1.取出最后一个元素
lasteum := int(src[len(src)-1])
//2.删除和最后一个元素相等长的字节
//fmt.Println("src", src)
newText := src[:len(src)-lasteum]
return newText
} //des加解密
//加密
func encryptDES(src, key []byte) []byte {
//1.创建并返回一个使用DES算法的cipher.Block接口。
block, err := des.NewCipher(key)
if err != nil {
panic(err)
}
//2.对src进行填充
src = padding(src, block.BlockSize())
//3.返回blockModel
//vi := []byte("aaaabbbb")
//blockModel := cipher.NewCBCEncrypter(block, vi)
//fmt.Println("src[:block.BlockSize()]", key[:block.BlockSize()])
blockModel := cipher.NewCBCEncrypter(block, key[:block.BlockSize()])
//4.crypto加密连续块
blockModel.CryptBlocks(src, src) return src
} //解密
func decryptDES(src, key []byte) []byte {
//1.创建并返回一个使用DES算法的cipher.Block接口。
block, err := des.NewCipher(key)
if err != nil {
panic(err)
}
//2.crypto解密
//vi := []byte("aaaabbbb")
//fmt.Println("src[:block.BlockSize()]", key[:block.BlockSize()])
blockModel := cipher.NewCBCDecrypter(block, key[:block.BlockSize()])
//3.解密连续块
blockModel.CryptBlocks(src, src)
//.删除填充数组
src = Depadding(src) return src
} //3des加解密
//3des加密
func encryptTripleDES(src, key []byte) []byte {
//1.创建并返回一个使用DES算法的cipher.Block接口。
block, err := des.NewTripleDESCipher(key)
if err != nil {
panic(err)
}
//2.对src进行填充
src = padding(src, block.BlockSize())
//3.返回blockModel
//vi := []byte("aaaabbbb")
//blockModel := cipher.NewCBCEncrypter(block, vi)
//fmt.Println("src[:block.BlockSize()]", key[:block.BlockSize()])
blockModel := cipher.NewCBCEncrypter(block, key[:block.BlockSize()])
//4.crypto加密连续块
blockModel.CryptBlocks(src, src) return src
} /*
要求密钥长度:
.16 ,24 ,32 byte
.在go接口中指定的密钥长度为16字节
分组长度
.16 ,24 ,32 byte
.分组长度和密钥长度相等
*/
//3des解密
func decryptTripleDES(src, key []byte) []byte {
//1.创建并返回一个使用DES算法的cipher.Block接口。
block, err := des.NewTripleDESCipher(key)
if err != nil {
panic(err)
}
//2.crypto解密
//vi := []byte("aaaabbbb")
//fmt.Println("src[:block.BlockSize()]", key[:block.BlockSize()])
blockModel := cipher.NewCBCDecrypter(block, key[:block.BlockSize()])
//3.解密连续块
blockModel.CryptBlocks(src, src)
//.删除填充数组
src = Depadding(src) return src
} //aes加解密
//aes加密
func encryptAES(src, key []byte) []byte {
//1.创建并返回一个使用DES算法的cipher.Block接口。
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
//2.对src进行填充
src = padding(src, block.BlockSize())
//3.返回blockModel
//vi := []byte("aaaabbbb")
//blockModel := cipher.NewCBCEncrypter(block, vi)
//fmt.Println("key[:block.BlockSize()]", key[:block.BlockSize()])
blockModel := cipher.NewCBCEncrypter(block, key[:block.BlockSize()]) //block.BlockSize() ==len(key)
//4.crypto加密连续块
blockModel.CryptBlocks(src, src) return src
} //aes解密
func decryptAES(src, key []byte) []byte {
//1.创建并返回一个使用DES算法的cipher.Block接口。
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
//2.crypto解密
//vi := []byte("aaaabbbb")
//fmt.Println("src[:block.BlockSize()]", key[:block.BlockSize()])
blockModel := cipher.NewCBCDecrypter(block, key[:block.BlockSize()]) //block.BlockSize() ==len(key)
//3.解密连续块
blockModel.CryptBlocks(src, src)
//.删除填充数组
src = Depadding(src) return src
}

go加密算法:CBC对称加密(一)--3DES/AES的更多相关文章

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

    package main import ( "bytes" //"crypto/aes" "crypto/cipher" "cry ...

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

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

  3. PHP、Java对称加密中的AES加密方法

    PHP AES加密 <?php ini_set('default_charset','utf-8'); class AES{ public $iv = null; public $key = n ...

  4. 加密算法--->对称加密与非对称加密算举例说明

    目前主流的加密方式有:(对称加密)AES.DES        (非对称加密)RSA.DSA 对称加密例子:des对称加密 des对称加密,对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用 ...

  5. .NET下的加密解密大全(2):对称加密

    本博文列出了.NET下常用的对称加密算法,并将它们制作成小DEMO,希望能对大家有所帮助. 公共代码[csharp]static byte[] CreateKey(int num) {     byt ...

  6. .net 对称加密DESCryptoServiceProvider

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

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

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

  8. 【java编程】加密算法-对称加密及AES加密算法

    转载:https://www.jianshu.com/p/3840b344b27c?utm_campaign=maleskine&utm_content=note&utm_medium ...

  9. Java利用DES/3DES/AES这三种算法分别实现对称加密

    转载地址:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了 ...

随机推荐

  1. 零零碎碎的java知识:static属性、普通属性、static代码块、普通代码块、构造函数

    本文中结论仅经本机测试,不保证在别的环境下成立.如果有什么不成立的地方务必告诉我_(:_」∠)_ java的内存是动态分配的,其机制和c/c++相当不一样……emmm在此不表. static: ·st ...

  2. golang构造函数

    http://blog.jobbole.com/107442/?utm_source=blog.jobbole.com&utm_medium=relatedPosts https://gocn ...

  3. Linux的inode的理解 ZZ

    文件名 -> inode -> device block 转自:http://www.ruanyifeng.com/blog/2011/12/inode.htmlhttp://blog.s ...

  4. 设计模式:访问者(Visitor)模式

    设计模式:访问者(Visitor)模式 一.前言    什么叫做访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+ ...

  5. TFS--解决新创建的windows用户无法访问TFS的问题

    今天入职新同事,帮忙配置TFS的账号碰到一个问题,TFS账号是映射取administrators组得 所以新建用户之后,无法马上引入TFS.查询原因是 Builtin组中没有该账号,以前也总是碰到新加 ...

  6. Wifi密码破解

    Wifi密码破解1:通过字典(暴力)破解WIFI密码   简单破解WEP/WPA/WPA2加密的WIFI密码,平台kali-linux 工具:Aircrack-ng 过程很简单:先抓含有正确密码的握手 ...

  7. PTA练习题之7-1 矩阵转置(10 分)

    7-1 矩阵转置(10 分) 将一个3×3矩阵转置(即行和列互换). 输入格式: 在一行中输入9个小于100的整数,其间各以一个空格间隔. 输出格式: 输出3行3列的二维数组,每个数据输出占4列. 输 ...

  8. 对HandlerExecutionChain类的理解分析

    HandlerExecutionChain类比较简单,好理解. ==================================================================== ...

  9. 绘图、Core Animation与硬件架构

    原文地址:http://blog.csdn.net/wzzvictory/article/details/11180241 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wan ...

  10. select、poll和epoll比较

    select select能监控的描述符个数由内核中的FD_SETSIZE限制,仅为1024,这也是select最大的缺点,因为现在的服务器并发量远远不止1024.即使能重新编译内核改变FD_SETS ...