区块链加/解密:对称加密


在CSDN博客中,阅读了有很多大神的博客,也学到了很多。首先在这里表示感谢
由于我个人的表达能力有限,有些知识点涉及的不够深入,无法全面科普到。大家可以到区块链加密讲解学下加/解密原理


针对于区块链加密算法,我准备给大家分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
}

对称加密

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
}

//进行测试
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

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

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
NewCipher NewCBCEncrypter CryptBlocks block blockMode blockMode block padding(src) NewCipher NewCBCEncrypter CryptBlocks

猜你喜欢

转载自blog.csdn.net/qq_36652517/article/details/85949642