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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 目录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))
}
相关文章
|
1月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
158 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
6月前
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
108 1
|
2月前
|
算法 安全 Go
Go语言中的加密和解密是如何实现的?
Go语言通过标准库中的`crypto`包提供丰富的加密和解密功能,包括对称加密(如AES)、非对称加密(如RSA、ECDSA)及散列函数(如SHA256)。`encoding/base64`包则用于Base64编码与解码。开发者可根据需求选择合适的算法和密钥,使用这些包进行加密操作。示例代码展示了如何使用`crypto/aes`包实现对称加密。加密和解密操作涉及敏感数据处理,需格外注意安全性。
64 14
|
3月前
|
Java 数据安全/隐私保护
对称加密、非对称加密、哈希摘要
对称加密使用同一密钥进行加解密,速度快但需保密;非对称加密采用公钥加密、私钥解密,公钥可公开,安全性高但速度较慢,双向通信需双方各持一对密钥;哈希摘要是从数据中提取特征,用于数据完整性校验,不同数据的哈希值几乎不会相同。
58 0
|
6月前
|
数据安全/隐私保护
aes之ecb模式的加密解密
aes之ecb模式的加密解密
|
6月前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
210 8
|
5月前
|
安全 网络协议 网络安全
【HTTPS】对称加密和非对称加密
【HTTPS】对称加密和非对称加密
67 0
|
5月前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
233 0
|
6月前
|
算法 安全 网络安全
概念区分:对称加密、非对称加密、公钥、私钥、签名、证书
概念区分:对称加密、非对称加密、公钥、私钥、签名、证书
357 0
|
6月前
|
安全 算法 数据安全/隐私保护
黑客克星!Python加密艺术大公开,AES、RSA双剑合璧,守护你的数字世界
在这个数据泛滥的时代,数字世界既充满了知识,也潜藏安全隐患。Python 作为强大的编程语言,以其独特的加密技术为我们的信息安全保驾护航。本文将介绍 AES 和 RSA 这两种加密算法,揭示它们如何协同工作,保护你的数字世界。AES(高级加密标准)以其高效、安全著称,能将敏感信息转化为难以破解的乱码。Python 的 `pycryptodome` 库让 AES 加密变得简单易行。然而,AES 面临密钥分发难题,此时 RSA(非对称加密算法)便大显身手,通过公钥加密、私钥解密的方式确保密钥传输安全。AES 与 RSA 在 Python 中交织成一道坚不可摧的防护网,共同守护我们的数字世界。
124 0