今天在用Golang解析php那边用Aes加密的一个key。网上大多是用base64将结果编码一下。而且用到了向量。我php

那边没有用到向量。所以golang这边也是要去掉的。参考网站的改了下。能够和php通用。

另外,需要注意的是加密的key只能是16,24,32.分别对应的是AES-128,AES-192,AES-256等

package main

import (

​	"bytes"

​	"crypto/aes"

​	"crypto/cipher"

​	"encoding/base64"

​	"encoding/hex"

​	"errors"

​	"fmt"

)

//填充

func pad(src []byte) []byte {

​	padding := aes.BlockSize - len(src)%aes.BlockSize

​	padtext := bytes.Repeat([]byte{byte(padding)}, padding)

​	return append(src, padtext...)

}

func unpad(src []byte) ([]byte, error) {

​	length := len(src)

​	unpadding := int(src[length-1])

​	if unpadding > length {

​		return nil, errors.New("unpad error. This could happen when incorrect encryption key is used")

​	}

​	return src[:(length - unpadding)], nil

}

func encrypt(key []byte, text string) (string, error) {

​	block, err := aes.NewCipher(key)

​	if err != nil {

​		return "", err

​	}

​	msg := pad([]byte(text))

​	ciphertext := make([]byte, aes.BlockSize+len(msg))

​	//没有向量,用的空切片

​	iv := make([]byte,aes.BlockSize)

​	mode := cipher.NewCBCEncrypter(block, iv)

​	mode.CryptBlocks(ciphertext[aes.BlockSize:], msg)

​	finalMsg := (base64.StdEncoding.EncodeToString(ciphertext))

​	fmt.Println(hex.EncodeToString([]byte(ciphertext[aes.BlockSize:])))

​	return finalMsg, nil

}

func decrypt(key []byte, text string) (string, error) {

​	block, err := aes.NewCipher(key)

​	if err != nil {

​		return "", err

​	}

​	decodedMsg,_ := hex.DecodeString(text)

​	iv  :=make([]byte,aes.BlockSize)

​	msg := decodedMsg

​	mode := cipher.NewCBCDecrypter(block, iv)

​	mode.CryptBlocks(msg,msg)

​	unpadMsg, err := unpad(msg)

​	if err != nil {

​		return "", err

​	}

​	return string(unpadMsg), nil

}

func main() {

​	key := []byte("0123456789abcdef")

​	encryptText, _ := encrypt(key, "123456")

​	rawText, err := decrypt(key, "2994dc19badcd3e820065f4f8211f584")

​	fmt.Println("text %s \n", rawText)

}

Golang中,Aes加解密的更多相关文章

  1. 关于java php go 中AES加解密秘钥长度问题

    今天心血来朝,想用go把php中的一个小功能重写一下,但在解密aes加密的数据时碰到了个坑! php的mcrypt拓展(貌似php7.1版本以上不支持了)提供了aes的加解密: 而且php aes 的 ...

  2. .Net Core AES加解密

    项目中token在传输过程中采用了AES加密,  网上找到的两篇博文都有写问题,在这里记录一下.Net Core 2.2代码中AES加解密的使用: //AES加密 传入,要加密的串和, 解密key p ...

  3. AES加解密算法在Android中的应用及Android4.2以上版本调用问题

     from://http://blog.csdn.net/xinzheng_wang/article/details/9159969 AES加解密算法在Android中的应用及Android4.2以上 ...

  4. Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

  5. C#与java中的AES加解密互解算法

    一.C#版AES加解密算法 public class AESCode { public string Key { get; set; } public string Encrypt(string va ...

  6. DES,AeS加解密,MD5,SHA加密

    1.DES一共就有4个参数参与运作:明文.密文.密钥.向量.其中这4者的关系可以理解为: 密文=明文+密钥+向量: 明文=密文-密钥-向量: 为什么要向量这个参数呢?因为如果有一篇文章,有几个词重复, ...

  7. c# Aes加解密和对象序列化

    aes加解密 public class AesCryptto { private string key = "hjyf57468jhmuist"; private string i ...

  8. AES加解密算法Qt实现

    [声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...

  9. aes加解密 Illegal key size

    做aes加密时,发生一个奇怪的错误,在本地环境是好的,发布到测试环境就出问题, java.security.InvalidKeyException: Illegal key size 想到本地环境之前 ...

随机推荐

  1. [MySQL] 事务的ACID特性

    事务的ACID特性: 原子性(atomicity):一个事务是一个不可分割的最小工作单位,事务中的所有操作要么都做,要么都不做. 一致性(consistency):事务前后数据的完整性必须保持一致.事 ...

  2. SpringBoot整合Fastdfs,实现图片上传(IDEA)

    我们部署Fastdfs,就是为了实现文件的上传. 现在使用idea整合Fastdfs,实现图片上传 部署环境:Centos7部署分布式文件存储(Fastdfs) 利用Java客户端调用FastDFS ...

  3. vm|vmware workstation 15|14 pro 激活|密钥|序列号|许可证

    VMware Workstation Pro 15 激活许可证 UY758-0RXEQ-M81WP-8ZM7Z-Y3HDA VF750-4MX5Q-488DQ-9WZE9-ZY2D6 UU54R-FV ...

  4. MacOS上传文件到windows ftp时链接文件不见了

    最近打包遇到了一个问题,打包完MAC的sdk包后,得到的是一个framework的文件夹,我们需要将这个framework传到ftp服务器上,另外,还要把这个文件夹下的Release文件夹里的文件替换 ...

  5. 第 33课 C++中的字符串(下)

    字符串与数字转换-标准库中提供了相关的类对字符串和数字进行转换-字符串流类(sstream)用于string的转换.<sstream>-相关头文件.istringstream-字符串输入流 ...

  6. mybatis多对多关联查询

    多对多关系 一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系.所谓多对多关系,其实是由两个互反的一对多关系组成.即多对多关系都会通过一个中间表来建立,例如选课表.学 ...

  7. GDB 调试C++

    原来比较熟悉用gdb调试C程序,没有用过gdb调试C++程序,原理上没有什么区别.在形式上有一些区别,因为C++支持名字空间和class等机制,把函数的可见域做了隔离. 拿envoy的代码作个例子: ...

  8. flask回顾

    pip install flask from flask import Flask app = Flask(__name__) # 命令行启动,用manager,访问会变的非常慢 pip instal ...

  9. ASP.NET CoreMVC 中的视图

    ASP.NET Core MVC 中的视图 MVC 中的视图 用于显示Controller提供给它的 Model 的业务数据. 视图是带有嵌入 Razor 标记的 HTML 模板. 如果编程语言是 C ...

  10. CF1136E Nastya Hasn't Written a Legend(线段树)

    还能说什么呢,简直太妙了. $$a_{i+1}<a_i+k_i$$ $$a_{i+1}-k_i-k_{i-1}-\cdots-k_1<a_i+k_i-k_i-k_{i-1}-\cdots- ...