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))
}
相关文章
|
2月前
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
|
2月前
|
数据安全/隐私保护
aes之ecb模式的加密解密
aes之ecb模式的加密解密
|
1月前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
40 0
|
1月前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
86 0
|
29天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
6天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。
|
14天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
15天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
16天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。
|
15天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。

热门文章

最新文章

下一篇
无影云桌面