zoukankan      html  css  js  c++  java
  • Golang中,Aes加解密

    今天在用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 
    ", rawText)
    
    }
    
  • 相关阅读:
    函数对象与闭包函数
    day15
    应用在tomcat下的四种部署方式(原创)
    Servlet的四种映射模式
    背景框代码
    RabbitMQ 示例-生产者-消费者-direct-topic-fanout
    idea 设置自动生成注释
    cSpring Boot整合RabbitMQ详细教程
    Windows下RabbitMQ安装及配置
    Threadlocal线程本地变量理解
  • 原文地址:https://www.cnblogs.com/smartrui/p/10150759.html
Copyright © 2011-2022 走看看