Go语言实现对称加密算法AES、DES、3DES和非对称加密算法RSA

简介: 目录1. 对称加密算法1.1 特点1.2 优缺点1.3 go语言实现对称加密算法1.3.1 AES1.3.2 DES1.3.3 DES (CBC模式)2. 非对称加密算法2.1 特点2.2 优缺点2.3 go语言实现非对称加密算法2.3.1 RSA最后

目录

1. 对称加密算法

1.1 特点

1.2 优缺点

1.3 go语言实现对称加密算法

1.3.1 AES

1.3.2 DES

1.3.3 DES (CBC模式)

2. 非对称加密算法

2.1 特点

2.2 优缺点

2.3 go语言实现非对称加密算法

2.3.1 RSA

最后

image.png


1. 对称加密算法

1.1 特点

加密和解密使用的是同一个密钥,数据私密性双向保证,也就是加密和解密都不能泄露密码

1.2 优缺点

优点:加密效率高,适合大些的数据加密

缺点:安全性相对非对称低

1.3 go语言实现对称加密算法

1.3.1 AES

AES-128:key长度16 字节


AES-192:key长度24 字节


AES-256:key长度32 字节

var key []byte = []byte("hallenhallenhall")
// 填充密码长度
func PadPwd(srcByte []byte,blockSize int)  []byte {
  // 16 13       13-3 = 10
  padNum := blockSize - len(srcByte)%blockSize
  ret := bytes.Repeat([]byte{byte(padNum)}, padNum)
  srcByte = append(srcByte, ret...)
  return srcByte
}
// 加密
func AesEncoding(src string) (string,error) {
  srcByte := []byte(src)
  fmt.Println(srcByte)
  // safer
  block, err := aes.NewCipher(key)
  if err != nil {
    return src, err
  }
  // 密码填充
  NewSrcByte := PadPwd(srcByte, block.BlockSize())  //由于字节长度不够,所以要进行字节的填充
  fmt.Println(NewSrcByte)
  dst := make([]byte, len(NewSrcByte))
  block.Encrypt(dst, NewSrcByte)
  fmt.Println(dst)
  // base64编码
  pwd := base64.StdEncoding.EncodeToString(dst)
  return pwd, nil
}
// 去掉填充的部分
func UnPadPwd(dst []byte) ([]byte,error) {
  if len(dst) <= 0 {
    return dst, errors.New("长度有误")
  }
  // 去掉的长度
  unpadNum := int(dst[len(dst)-1])
  return dst[:(len(dst) - unpadNum)], nil
}
// 解密
func AesDecoding(pwd string) (string,error) {
  pwdByte := []byte(pwd)
  pwdByte, err := base64.StdEncoding.DecodeString(pwd)
  if err != nil {
    return pwd, err
  }
  block, errBlock := aes.NewCipher(key)
  if errBlock != nil {
    return pwd, errBlock
  }
  dst := make([]byte, len(pwdByte))
  block.Decrypt(dst, pwdByte)   
  dst, _ = UnPadPwd(dst)    // 填充的要去掉
  return string(dst), nil
}

1.3.2 DES

DES:支持字节长度是8

// 只支持8字节的长度
var desKey = []byte("hallenha")
// 加密
func DesEncoding(src string) (string,error) {
  srcByte := []byte(src)
  block, err := des.NewCipher(desKey)
  if err != nil {
    return src, err
  }
  // 密码填充
  newSrcByte := PadPwd(srcByte, block.BlockSize())
  dst := make([]byte, len(newSrcByte))
  block.Encrypt(dst, newSrcByte)
  // base64编码
  pwd := base64.StdEncoding.EncodeToString(dst)
  return pwd, nil
}
// 解密
func DesDecoding(pwd string) (string,error) {
  pwdByte, err := base64.StdEncoding.DecodeString(pwd)
  if err != nil {
    return pwd, err
  }
  block, errBlock := des.NewCipher(desKey)
  if errBlock != nil {
    return pwd, errBlock
  }
  dst := make([]byte, len(pwdByte))
  block.Decrypt(dst, pwdByte)
  // 填充的要去掉
  dst, _ = UnPadPwd(dst)
  return string(dst), nil
}

1.3.3 DES (CBC模式)

des——CBC模式,key长度必须为24

// 3des的key,长度是24
var tdesKey = []byte("hallenhallenhallenhallen")
// 3des加密
func TDesEncoding(src string) (string,error) {
  srcByte := []byte(src)
  block, err := des.NewTripleDESCipher(tdesKey) // 和des的区别
  if err != nil {
    return src, err
  }
  // 密码填充
  newSrcByte := PadPwd(srcByte, block.BlockSize())
  dst := make([]byte, len(newSrcByte))
  block.Encrypt(dst, newSrcByte)
  // base64编码
  pwd := base64.StdEncoding.EncodeToString(dst)
  return pwd, nil
}
// 3des解密
func TDesDecoding(pwd string) (string,error) {
  pwdByte, err := base64.StdEncoding.DecodeString(pwd)
  if err != nil {
    return pwd, err
  }
  block, errBlock := des.NewTripleDESCipher(tdesKey) // 和des的区别
  if errBlock != nil {
    return pwd, errBlock
  }
  dst := make([]byte, len(pwdByte))
  block.Decrypt(dst, pwdByte)
  // 填充的要去掉
  dst, _ = UnPadPwd(dst)
  return string(dst), nil
}

2. 非对称加密算法

2.1 特点

加密和解密的密钥不同,有两个密钥(公钥和私钥)


公钥:可以公开的密钥;公钥加密,私钥解密


私钥:私密的密钥;私钥加密,公钥解密


私密单方向保证,只要有一方不泄露就没问题


2.2 优缺点

优点:安全性相对对称加密高


缺点:加密效率低,适合小数据加密


2.3 go语言实现非对称加密算法

消息发送方利用对方的公钥进行加密,消息接受方收到密文时使用自己的私钥进行解密


对哪一方更重要,哪一方就拿私钥


注意:


公钥和密钥生成的时候要有一种关联,要把密钥和公钥保存起来。


2.3.1 RSA

package main
import (
  "crypto/rand"
  "crypto/rsa"
  "crypto/x509"
  "encoding/pem"
  "fmt"
  "os"
)
// 保存生成的公钥和密钥
func SaveRsaKey(bits int) error {
  privateKey,err := rsa.GenerateKey(rand.Reader,bits)
  if err != nil {
    fmt.Println(err)
    return err
  }
  publicKey := privateKey.PublicKey
  // 使用x509标准对私钥进行编码,AsN.1编码字符串
  x509Privete := x509.MarshalPKCS1PrivateKey(privateKey)
  // 使用x509标准对公钥进行编码,AsN.1编码字符串
  x509Public := x509.MarshalPKCS1PublicKey(&publicKey)
  // 对私钥封装block 结构数据
  blockPrivate := pem.Block{Type: "private key",Bytes: x509Privete}
  // 对公钥封装block 结构数据
  blockPublic := pem.Block{Type: "public key",Bytes: x509Public}
  // 创建存放私钥的文件
  privateFile, errPri := os.Create("privateKey.pem")
  if errPri != nil {
    return errPri
  }
  defer privateFile.Close()
  pem.Encode(privateFile,&blockPrivate)
  // 创建存放公钥的文件
  publicFile, errPub := os.Create("publicKey.pem")
  if errPub != nil {
    return errPub
  }
  defer publicFile.Close()
  pem.Encode(publicFile,&blockPublic)
  return nil
}
// 加密
func RsaEncoding(src , filePath string)  ([]byte,error){
  srcByte := []byte(src)
  // 打开文件
  file,err := os.Open(filePath)
  if err != nil {
    return srcByte,err
  }
  // 获取文件信息
  fileInfo, errInfo := file.Stat()
  if errInfo != nil {
    return srcByte, errInfo
  }
  // 读取文件内容
  keyBytes := make([]byte, fileInfo.Size())
  // 读取内容到容器里面
  file.Read(keyBytes)
  // pem解码
  block,_ := pem.Decode(keyBytes)
  // x509解码
  publicKey , errPb := x509.ParsePKCS1PublicKey(block.Bytes)
  if errPb != nil {
    return srcByte, errPb
  }
  // 使用公钥对明文进行加密
  retByte, errRet := rsa.EncryptPKCS1v15(rand.Reader,publicKey, srcByte)
  if errRet != nil {
    return srcByte, errRet
  }
  return retByte,nil
}
// 解密
func RsaDecoding(srcByte []byte,filePath string) ([]byte,error) {
  // 打开文件
  file,err := os.Open(filePath)
  if err != nil {
    return srcByte,err
  }
  // 获取文件信息
  fileInfo,errInfo := file.Stat()
  if errInfo != nil {
    return srcByte,errInfo
  }
  // 读取文件内容
  keyBytes := make([]byte,fileInfo.Size())
  // 读取内容到容器里面
  _, _ = file.Read(keyBytes)
  // pem解码
  block,_ := pem.Decode(keyBytes)
  // x509解码
  privateKey ,errPb := x509.ParsePKCS1PrivateKey(block.Bytes)
  if errPb != nil {
    return keyBytes,errPb
  }
  // 进行解密
  retByte, errRet := rsa.DecryptPKCS1v15(rand.Reader,privateKey,srcByte)
  if errRet != nil {
    return srcByte,errRet
  }
  return retByte,nil
}
func main() {
  //err := SaveRsaKey(2048)
  //if err != nil {
  //  fmt.Println("KeyErr",err)
  //}
  msg, err := RsaEncoding("FanOne","publicKey.pem")
  fmt.Println("msg",msg)
  if err != nil {
    fmt.Println("err1",err)
  }
  msg2,err := RsaDecoding(msg,"privateKey.pem")
  if err != nil {
    fmt.Println("err",err)
  }
  fmt.Println("msg2",string(msg2))
}
相关文章
|
8月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
242 15
|
8月前
|
监控 算法 安全
基于 PHP 语言深度优先搜索算法的局域网网络监控软件研究
在当下数字化时代,局域网作为企业与机构内部信息交互的核心载体,其稳定性与安全性备受关注。局域网网络监控软件随之兴起,成为保障网络正常运转的关键工具。此类软件的高效运行依托于多种数据结构与算法,本文将聚焦深度优先搜索(DFS)算法,探究其在局域网网络监控软件中的应用,并借助 PHP 语言代码示例予以详细阐释。
173 1
|
9月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
11月前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
207 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
7月前
|
算法 安全 数据安全/隐私保护
基于AES的遥感图像加密算法matlab仿真
本程序基于MATLAB 2022a实现,采用AES算法对遥感图像进行加密与解密。主要步骤包括:将彩色图像灰度化并重置大小为256×256像素,通过AES的字节替换、行移位、列混合及轮密钥加等操作完成加密,随后进行解密并验证图像质量(如PSNR值)。实验结果展示了原图、加密图和解密图,分析了图像直方图、相关性及熵的变化,确保加密安全性与解密后图像质量。该方法适用于保护遥感图像中的敏感信息,在军事、环境监测等领域具有重要应用价值。
305 35
|
8月前
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
187 8
|
8月前
|
存储 监控 算法
基于 PHP 语言的滑动窗口频率统计算法在公司局域网监控电脑日志分析中的应用研究
在当代企业网络架构中,公司局域网监控电脑系统需实时处理海量终端设备产生的连接日志。每台设备平均每分钟生成 3 至 5 条网络请求记录,这对监控系统的数据处理能力提出了极高要求。传统关系型数据库在应对这种高频写入场景时,性能往往难以令人满意。故而,引入特定的内存数据结构与优化算法成为必然选择。
224 3
|
9月前
|
算法 安全 Go
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
本文探讨了如何利用 Go 语言中的 Bloom Filter 算法提升公司局域网管理系统的性能。Bloom Filter 是一种高效的空间节省型数据结构,适用于快速判断元素是否存在于集合中。文中通过具体代码示例展示了如何在 Go 中实现 Bloom Filter,并应用于局域网的 IP 访问控制,显著提高系统响应速度和安全性。随着网络规模扩大和技术进步,持续优化算法和结合其他安全技术将是企业维持网络竞争力的关键。
202 2
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
|
9月前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
191 3
|
9月前
|
缓存 监控 算法
内网监控管理软件:PHP 语言队列算法揭秘
在数字化办公环境中,内网监控管理软件对企业的稳定运行和信息安全至关重要。本文深入介绍PHP中的队列算法及其在内网监控软件中的应用,包括监控数据收集、任务调度和日志记录等场景,通过代码示例展示其实现方法。队列算法可提高性能、保证数据顺序并实现异步处理,为企业提供高效的安全保障。
157 1