前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AES对称加密算法如何用golang语言实现?

AES对称加密算法如何用golang语言实现?

作者头像
公众号-利志分享
发布2022-04-25 09:21:43
1.3K0
发布2022-04-25 09:21:43
举报
文章被收录于专栏:利志分享

数据的加密算法一般都可以分几类,有对称加密,非对称加密,不可逆加密(也叫hash算法或者散列算法)。

对称加密:

对称加密算法是当前使用最广,使用频率最高的加密算法,优点:计算量小,速度快,加密效率高,适合对海量数据进行加密处理。缺点:密钥管理和分发难,不够安全,如果一方的密钥泄露,那加密信息就不安全了。常见的对称加密有:DES、3DES、AES

非对称加密:

非对称加密是非常可靠,密钥越长,则难破解。优点:加密和解密的密钥不一致,公钥是公开的,这样的密钥就可以方便传递,从而不被破解。缺点:加密速度慢,rsa只能加密少量数据。比较常见的就是RSA非对称加密算法。

不可逆加密:

常见的不可逆算法又叫hash算法,散列算法,常见的算法有MD5,SHA1,SHA-2,HMAC

这里我们来看下AES的实现,下面我们看下golang是如何实现这个加解密的。

代码语言:javascript
复制
package main

import (
  "bytes"
  "crypto/aes"
  "crypto/cipher"
)

// aes加密
func Encrypt(plantText, key []byte) ([]byte, error) {
  // 这个代码比较重要,是涉及到签名大小
  if len(key) > 16 {
    key = key[:16]
  }
  //NewCipher该函数限制了输入k的长度必须为16, 24或者32l
  block, err := aes.NewCipher(key)
  if err != nil {
    return nil, err
  }
  //补全码
  plantText = PKCS7Padding(plantText, block.BlockSize())
  //加密模式
  blockModel := cipher.NewCBCEncrypter(block, key[:block.BlockSize()])
  //创建数组
  ciphertext := make([]byte, len(plantText))
  //加密
  blockModel.CryptBlocks(ciphertext, plantText)
  return ciphertext, nil
}

func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
  padding := blockSize - len(ciphertext)%blockSize
  padtext := bytes.Repeat([]byte{byte(padding)}, padding)
  return append(ciphertext, padtext...)
}

// aes解密
func Decrypt(ciphertext, key []byte) ([]byte, error) {
  // 这个代码比较重要,是涉及到签名大小
  if len(key) > 16 {
    key = key[:16]
  }
  //分组秘钥
  block, err := aes.NewCipher(key) // 选择加密算法
  if err != nil {
    return nil, err
  }
  //加密模式
  blockModel := cipher.NewCBCDecrypter(block, key[:block.BlockSize()])
  plantText := make([]byte, len(ciphertext))
  //解密
  blockModel.CryptBlocks(plantText, ciphertext)
  //去补全码
  plantText = PKCS7UnPadding(plantText, block.BlockSize())
  return plantText, nil
}

func PKCS7UnPadding(plantText []byte, blockSize int) []byte {
  length := len(plantText)
  unpadding := int(plantText[length-1])
  return plantText[:(length - unpadding)]
}

关于AES,AES:高级加密标准(Advanced Encryption Standard),又称Rijndael加密法,这个标准用来替代原先的DES。AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。块:对明文进行加密的时候,先要将明文按照128bit进行划分。填充方式:因为明文的长度不一定总是128的整数倍,所以要进行补位,我们这里采用的是PKCS7填充方式。

总结:

1:AES加密的密钥长度必须是16,24,32字节。

2:关于AES加密比较常用来加密大文件的信息。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档