其实对称加密中的: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. Android 高速录像(2)

    private void startRecordVideo() { if (index == VIDEO_1080) { if (!supported1080P120Fps) { showToast( ...

  2. 向Github提交更改的代码

    更改了本地的某一文件的代码,那么如何覆盖Github上的同一文件代码呢?请看以下步骤: 1.先用 git status 看你更改了哪些文件: 2.然后 git add 你想要提交的更改的文件 或者 g ...

  3. react-native 在Xcode上传到iTunes Connect里报错

    在xcode里面点击“upload to app store”的时候,提示“the session's status is FAILED and the error description is 'C ...

  4. [转] RISC-V架构介绍

    1. RISC-V和其他开放架构有何不同 如果仅从"免费"或"开放"这两点来评判,RISC-V架构并不是第一个做到免费或开放的处理器架构. 在开始之前,我们先通 ...

  5. SQL UNION操作符使用

    SQL UNION 操作符 SQL UNION 操作符合并两个或多个 SELECT 语句的结果. SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意 ...

  6. 安装Access Database Engine后,提示未注册Microsoft.ACE.OLEDB.12.0

    未注册Microsoft.ACE.OLEDB.12.0 ,下载安装 Microsoft Access Database Engine:https://www.microsoft.com/en-us/d ...

  7. Web API 2 入门——使用ASP.NET Web API和Angular.js构建单页应用程序(SPA)(谷歌翻译)

    在这篇文章中 概观 演习 概要 由网络营 下载网络营训练包 在传统的Web应用程序中,客户机(浏览器)通过请求页面启动与服务器的通信.然后,服务器处理请求,并将页面的HTML发送给客户端.在与页面的后 ...

  8. python 中的list&tuple

    list Python内置的一种数据类型是列表:list>>> classmates = ['Michael', 'Bob', 'Tracy']>>> classm ...

  9. My SQL 和SQL Server区别

    MySQL 与SQL Server区别 今天了解了二者区别,整理网上查阅资料,总结列举如下: MSSQL == SQL server 是sybase与微软合作时期的产物. 对于程序开发人员而言,目前使 ...

  10. 【2D游戏引擎】那些年对游戏对象的思考

    WIP源代码: Github OSC镜像 对象系统以对象为中心,对象系统的最基本设计策略是基于组件的设计.对象系统将尽量避免使用继承方式来拓展游戏对象,恰当的使用Mix-in来来最属性做拓展,单个属性 ...