go加密算法:CBC对称加密(一)--3DES/AES
其实对称加密中的: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的更多相关文章
- go加密算法:CBC对称加密(一)--DES
package main import ( "bytes" //"crypto/aes" "crypto/cipher" "cry ...
- 加密算法(对称加密)AES、DES (非对称加密)RSA、DSA
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA
- PHP、Java对称加密中的AES加密方法
PHP AES加密 <?php ini_set('default_charset','utf-8'); class AES{ public $iv = null; public $key = n ...
- 加密算法--->对称加密与非对称加密算举例说明
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA 对称加密例子:des对称加密 des对称加密,对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用 ...
- .NET下的加密解密大全(2):对称加密
本博文列出了.NET下常用的对称加密算法,并将它们制作成小DEMO,希望能对大家有所帮助. 公共代码[csharp]static byte[] CreateKey(int num) { byt ...
- .net 对称加密DESCryptoServiceProvider
1.生成密钥以加密和解密数据 DESCryptoServiceProvider 基于一种对称加密算法.对称加密需要密钥和初始化矢量 (IV) 来加密数据.要解密该数据,您必须拥有此同一密钥和 IV.您 ...
- https 结合使用 对称加密和非对称加密
(一)对称加密(Symmetric Cryptography) ---共享密钥加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥( ...
- 【java编程】加密算法-对称加密及AES加密算法
转载:https://www.jianshu.com/p/3840b344b27c?utm_campaign=maleskine&utm_content=note&utm_medium ...
- Java利用DES/3DES/AES这三种算法分别实现对称加密
转载地址:http://blog.csdn.net/smartbetter/article/details/54017759 有两句话是这么说的: 1)算法和数据结构就是编程的一个重要部分,你若失掉了 ...
随机推荐
- C++模板详解(系转载,但是个人添加了一些内容)
原文地址:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html 零.概述 模板是C++支持参数化多态的工具,使用模板可以使用户为类或 ...
- idea 出现 java.lang.OutOfMemoryError: PermGen space
今天在项目启动时候,刚刚启动 就 报了 Exception in thread "http-bio-8080-exec-1" 之后 出现了 java.lang.OutOfMemor ...
- Java中的volatile关键字的功能
Java中的volatile关键字的功能 volatile是java中的一个类型修饰符.它是被设计用来修饰被不同线程访问和修改的变量.如果不加入volatile,基本上会导致这样的结果:要么无法编写多 ...
- 使用GDI技术创建ASP.NET验证码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...
- Linux Mint 18.2安装后需要进行的设置
自己的笔记本电脑升级到win10后各种不好用,运行速度慢,开关机时间很长,系统也是经常性的更新,外加发热严重.更改设置和更换驱动都没能解决问题.另外感觉在Linux下能够更加专注,所以索性将主系统更换 ...
- Dapper进行增删改查 z
http://www.cnblogs.com/huangkaiyan10/p/4640548.html 项目背景 前一段时间,开始做一个项目,在考虑数据访问层是考虑技术选型,考虑过原始的ADO.NET ...
- Windows下Redis集群配置
Redis集群学习地址:http://blog.csdn.net/dc_726/article/details/11694437 Windows-32系统下搭建Redis集群 一.Redis主从同步原 ...
- liunx screen使用简单实验
liunx screen使用 今天因工作需要使用到screen工具,感觉挺有意思,记录一下 GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地 ...
- GO语言(四)线程通信
package main import "fmt" func fibon(c,quit chan int) { x,y := , for { select { case c < ...
- 程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
public static DataTable Join(DataTable First, DataTable Second, DataColumn[] FJC, DataColumn[] SJC) ...