针对于区块链加密算法,我准备给大家分3部分来讲解
主要讲解的是如何运用go现有的库,实现对称加密
需要注意的点是:该对称加密使用的CBC加解密
前期需要了解:
明文加密的分组操作
.分组的长度 = 密钥的长度 //key = 64bit/8
.将每组数据和密钥进行位运算
.每组的密文长度 = 每组的明文长度
对称加密涉及go语言库的应用
对称加密:
1.des/3des/aes.NewCipher生成Cipher.NewCBC加/解密的数据模块
2.使用Cipher.NewCBC进行加/解密
3.对数据进行填充/删除
1.填充:Cipher.NewCBC加密之前
2.删除:Cipher.NewCBC解密之后
由于使用的是CBC加/解密。该加密过程需要使明文按密钥长度进行分组:(每组文明的长度=密钥长度),再对分组后的明文进行加密
//填充
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
}
//加密
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
}
//进行测试
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", string(des))
}
3des/3重des,加密级别较高。使用的密钥长度是des密钥长度的3倍
//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
}
//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
}
//测试
func main() {
fmt.Println("=== 3des 加解密 ===")
scr1 := []byte("少壮不努力,活该你单身,223333")
key1 := []byte("aaabbbaa12345678ccddeeff")
//3组密钥可以相同,也可以不同。都不相同时,安全系数最高
src1 := encryptTripleDES(scr1, key1)
//fmt.Println("enpadding", src1):每次运行加密后的数据一样
des1 := decryptTripleDES(src1, key1)
fmt.Println("depadding", des1)
}
aes较前2者加密的安全级别更高,算法的原理却一样。不过对密钥长度有要求:16/24/32 byte
//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
}
//aes测试
func main() {
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)
}
罗列出所需要的库:
des
cipher