Golang加密系列之AES

君子藏锋 · · 12058 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

这里我们只讨论使用aes加密算法,pkcs7padding,CBC模式模式进行加密。

加密代码:

func Encrypt(plantText, key []byte) ([]byte, error) {
   block, err := aes.NewCipher(key) //选择加密算法
   if err != nil {
      return nil, err
   }
   plantText = PKCS7Padding(plantText, block.BlockSize())

   blockModel := cipher.NewCBCEncrypter(block, key)

   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...)
}

解密代码:

func Decrypt(ciphertext, key []byte) ([]byte, error) {
   keyBytes := []byte(key)
   block, err := aes.NewCipher(keyBytes) //选择加密算法
   if err != nil {
      return nil, err
   }
   blockModel := cipher.NewCBCDecrypter(block, keyBytes)
   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)]
}

OK,代码上完,需要立刻能干活的童鞋,直接command+c & command+v 就OK了,想折腾的童鞋接着往下看,我们来讨论下相关的概念性的东西,

AES:高级加密标准(Advanced Encryption Standard),又称Rijndael加密法,这个标准用来替代原先的DES。AES加密数据块分组长度必须为128bit(byte[16]),密钥长度可以是128bit(byte[16])、192bit(byte[24])、256bit(byte[32])中的任意一个。

块:对明文进行加密的时候,先要将明文按照128bit进行划分。

填充方式:因为明文的长度不一定总是128的整数倍,所以要进行补位,我们这里采用的是PKCS7填充方式,关于PKCS7,请戳这里

模式:这个,介绍起来有点复杂,请戳



有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:君子藏锋

查看原文:Golang加密系列之AES

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

12058 次点击  
加入收藏 微博
1 回复  |  直到 2000-01-01 00:00:00
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传