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

编程入门 行业动态 更新时间:2024-10-28 12:20:30

<a href=https://www.elefans.com/category/jswz/34/1769670.html style=区块链加/解密:对称加密"/>

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

区块链加/解密 一

  • 对称加密:加/解密用同一密钥
    • 填充与删除
    • 对称加密
      • des
      • 3des
      • aes
    • 快速学习加密小技巧:

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


针对于区块链加密算法,我准备给大家分3部分来讲解

  • 第一部分:对称加密
    • 对数据填充/删除
    • des/3des/aes
  • 第二部分:非对称加密
    • 生成公私钥pem
    • rsa加解密
  • 第三部分:对称加密与非对称加密的比较与应用
    • 对称与非对称加密的优劣
    • 应用于生活

对称加密:加/解密用同一密钥

主要讲解的是如何运用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)
}

快速学习加密小技巧:

  • 先弄清了算法的逻辑,可以使用倒推的方法,查找到要实现这一步,需要使用到怎样的参数与接口。依次倒推,就可以将实现逻辑全部理清,举个栗子
罗列出所需要的库:descipher
  • 完整代码github:

更多推荐

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

本文发布于:2023-06-25 17:20:12,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/881892.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:区块   对称

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!