go语言

您所在的位置:网站首页 区块链要学什么语言 go语言

go语言

2024-07-16 08:06| 来源: 网络整理| 查看: 265

温馨跳转链接:模块二:go语言–区块链学习(二)-CSDN博客 温馨跳转链接:模块三:go语言–区块链学习(三)-CSDN博客

文章目录 模块一:密码学1.1 密码介绍1.1.1 为什么要加密 ?1.1.2 常见的几种加密算法1.1.3 加密三要素 1.2 编码解码1.2.1 常见的几种编码1.2.2 go实现base64编码、解码1.2.3 go实现base58编码、解码 1.3 哈希算法1.3.1 特点1.3.2 常用的几种哈希算法1.3.3 go实现哈希算法举例1.3.3.1 go实现md4加密1.3.3.2 go实现md5加密1.3.3.3 go实现sha256加密 1.4 对称加密1.4.1 特点1.4.2 优点1.4.3 缺点1.4.4 场景分析1.4.5 常见的对称加密方式1.4.5.1 go实现des加密1.4.5.2 go实现3des加密1.4.5.3 go实现aes加密 1.5 非对称加密1.5.1 特点1.5.2 优点1.5.3 缺点1.5.4 场景分析1.5.5 常见的非对称加密方式1.5.5.1 go实现rsa加密 1.6 数字签名1.6.1 数字签名介绍1.6.2 go实现数字签名1.6.2.1 go实现rsa数字签名1.6.2.2 go实现ecc数字签名

模块一:密码学 1.1 密码介绍 1.1.1 为什么要加密 ?

保护隐私和数据安全:在信息传输过程中,不加密的数据可以被未经授权的人员截获和查看,这可能导致个人隐私泄露、商业机密被窃取或者敏感数据被篡改。通过加密数据,可以确保只有授权的人员能够解密和访问数据,提高了数据的安全性。

防止数据篡改:在信息传输过程中,数据可能会被篡改或修改,这可能导致信息内容的损坏或误导。通过加密数据,可以在接收方验证数据的完整性,确保传输的数据没有被篡改。

防止重放攻击:重放攻击是指攻击者拦截并重放先前传输的数据,以达到欺骗或恶意目的。通过加密数据并使用防重放技术,可以防止攻击者复用先前的数据来进行攻击。

遵守法律和合规要求:根据一些行业标准、法律法规和合规要求,某些类型的数据在传输过程中必须进行加密,以确保数据的安全性和保密性。加密数据可以帮助组织遵守相关的法律和合规要求。

举例:

小明–>小红:

原文:你好啊,可以加个好友吗密钥:+2密文:请问你儿童好雨哦啊怕是,地方可规划以接口加两种个形参好那么友请问吗密钥(密码):-2解密:请问你儿童好雨哦啊怕是,地方可规划以接口加两种个形参好那么友请问吗 你好啊,可以加个好友吗 1.1.2 常见的几种加密算法 编码解码:是将信息从一种形式转换为另一种形式的过程。编码通常用于将可读文本转换为二进制格式,以便在计算机之间传输或存储数据时使用。解码是将已编码的信息还原为原始形式的过程。哈希加密:也称为散列函数,是一种通过将任意长度的消息压缩为固定长度的摘要或哈希值的加密方法。哈希值是唯一的,并且由输入数据完全决定。但是,由于不同的消息可以生成相同的哈希值,因此哈希加密并不是完全安全的加密方式。对称加密:是指使用相同的密钥进行加密和解密的加密方式。这意味着发送方和接收方都必须知道密钥。对称加密速度快,但密钥需要在发送和接收之间传递。非对称加密:是指使用一对密钥(公钥和私钥)进行加密和解密的加密方式。公钥可公开,而私钥则必须保密。非对称加密安全性高,但速度较慢。数字签名:数字签名是一种加密技术,用于确保数字文档的完整性和身份验证。它使用非对称加密来创建一个数字签名,该签名包含文档的摘要和私钥。通过验证数字签名,可以确定文档是否被篡改,并且签名者是合法的。 1.1.3 加密三要素 明文/密文:明文是未经过加密的数据,而密文是已经进行加密转换的数据。密钥:密钥是用于加密和解密数据的秘密值。密钥的安全性决定了数据的安全性。对称加密使用相同的密钥进行加密和解密,而非对称加密则使用一对密钥(公钥和私钥)进行加密和解密。加密算法/解密算法:加密算法是用于将明文转换为密文的数学函数。解密算法是用于将密文转换回明文的逆函数。加密算法的安全性越高,破解难度就越大。

加密三要素共同构成了加密系统,其中密钥的保护和管理非常重要,不当的密钥管理会导致加密系统的破解和信息泄露。

1.2 编码解码 1.2.1 常见的几种编码 base64:26个小写字母、26个大写字母、10个数字、/、+base58(区块链):去掉6个容易混淆的,去掉0,大写的O、大写的I、小写的L、/、+ /、+影响双击选择 1.2.2 go实现base64编码、解码

Go语言的encoding/base64包提供了对base64编码和解码的支持。base64是一种将二进制数据转换为可打印ASCII字符的编码方式,常用于在网络传输中以文本形式表示二进制数据。

该包中的主要函数有以下几个:

func Encode(dst, src []byte):将给定的字节切片src进行base64编码,并将结果存储在dst中。返回编码后的字节数。func Decode(dst, src []byte) (n int, err error):将给定的base64编码的src进行解码,并将解码结果存储在dst中。返回解码后的字节数。func EncodeToString(src []byte) string:将给定的字节切片src进行base64编码,并返回编码后的字符串。func DecodeString(s string) ([]byte, error):将给定的base64编码的字符串s进行解码,并返回解码后的字节切片。

使用encoding/base64包进行base64编码和解码非常简单,可以按照以下步骤进行操作:

导入包:import “encoding/base64”编码:调用base64包的EncodeToString函数,将要编码的数据作为参数传入,得到base64编码后的字符串。解码:调用base64包的DecodeString函数,将要解码的base64字符串作为参数传入,得到解码后的字节切片。

通过encoding/base64包,可以方便地进行base64编码和解码,常用于处理二进制数据在文本传输中的需求,如图像、音频等文件的传输与存储。

base64编码 src := []byte("hello") buf := base64.StdEncoding.EncodeToString(src) // 在url中使用 src := []byte("http://127.0.0.1:8080/?name=hello") buf := base64.URLEncoding.EncodeToString(src) base64解码 dbuf, err := base64.StdEncoding.DecodeString(buf) if err != nil { fmt.Println(err) return } fmt.Println(string(dbuf))

代码:

package main import ( "encoding/base64" "fmt" ) func main() { { src := []byte("hello") buf := base64.StdEncoding.EncodeToString(src) dbuf, err := base64.StdEncoding.DecodeString(buf) if err != nil { fmt.Println(err) return } fmt.Println(string(dbuf)) } { src := []byte("http://127.0.0.1:8080/?name=hello") buf := base64.URLEncoding.EncodeToString(src) dbuf, err := base64.URLEncoding.DecodeString(buf) if err != nil { fmt.Println(err) return } fmt.Println(string(dbuf)) } } 1.2.3 go实现base58编码、解码

base58编码表

ValueCharValueCharValueCharValueChar0115G30X45n1216H31Y46o2317J32Z47p3418K33a48q4519L34b49r5620M35c50s6721N36d51t7822P37e52u8923Q38f53v9A24R39g54w10B25S40h55x11C26T41i56y12D27U42j57z13E28V43k14F29W44m

字符1代表0,字符2代表1,…,字符z代表57

base58编码:

数据分块:首先将二进制数据划分为固定大小的块。每个块通常包含特定数量的位,通常为8位(1字节)大小。这些块一个接一个地进行处理。

二进制转十进制转换:将每个二进制数据块转换为一个十进制值。此转换通过将二进制数据解释为基于256的整数来执行(因为每个字节有256个可能的值)。

映射到base58字符集:然后将在上一步中获得的十进制值映射到base58字符集中对应的字符。此映射是通过反复将十进制值除以58并使用余数作为索引从base58集合中选择字符来完成的。

构建编码字符串:从映射过程中获得的字符被连接在一起以形成base58编码字符串。

处理前导零:在某些情况下,原始二进制数据中的前导零可能导致编码字符串中出现前导的 ‘1’ 字符。这些前导的 ‘1’ 字符通常被省略或替换为特殊字符(例如 ‘1’),以保持可读性。

const ( b58Alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz" ) func Base58Encode(input []byte) string { var result strings.Builder // 将待编码的字节数组input转换成大整数,如:hello(104 101 108 108 111) --> 104*256^4 + 101*256^3 + 108*256^2 + 108*256^1 + 111*256^0 = 448378203247 x := new(big.Int).SetBytes(input) base := big.NewInt(58) zero := big.NewInt(0) // 对大整数x进行遍历,每次将x除以58,得到商和余数。将余数映射到Base58字母表中,并将结果存储在字符串构建器result中。不断重复该过程,直到商为0 for x.Cmp(zero) > 0 { mod := new(big.Int) x.DivMod(x, base, mod) result.WriteByte(b58Alphabet[mod.Int64()]) } // 处理前导0:对输入的字节数组进行遍历,统计前导的0的个数。根据Base58编码规则,在编码后的字符串中会添加相应数量的前导1 for _, b := range input { if b != 0 { break } result.WriteByte(b58Alphabet[0]) } // 将result中的字符串反转,得到最终的Base58编码结果 reversedResult := result.String() reversedResultBytes := []byte(reversedResult) for i, j := 0, len(reversedResultBytes)-1; i 0 { mod := new(big.Int) x.DivMod(x, base, mod) result.WriteByte(b58Alphabet[mod.Int64()]) } // Add leading 1's for zeros in the input for _, b := range input { if b != 0 { break } result.WriteByte(b58Alphabet[0]) } // Reverse the result reversedResult := result.String() reversedResultBytes := []byte(reversedResult) for i, j := 0, len(reversedResultBytes)-1; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3